自定义注解的使用Annotation

2021-01-06  本文已影响0人  陈萍儿Candy

自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
public @interface TestAnnotation {

    String name();

    int getCode() default 0;
}

在Person类中使用上面注解

@TestAnnotation(name = "00",getCode = 0)
public class Person {
    
    private String TAG = "Person";

    @TestAnnotation(name = "123")
    public String name;
    
    @TestAnnotation(name = "4", getCode = 4)
    public void gotoWork(int time) {
        Log.i(TAG, "gotoWork: ");
    }
}

解析注解的代码

class AnnotationMain {
    public static void main(String[] args) {
        Person person = new Person();
        Class<? extends Person> aClass = person.getClass();
        // aClass对应的类是否被注解
        if (aClass.isAnnotationPresent(TestAnnotation.class)) {
            // 获取指定的注解
            TestAnnotation annotation = aClass.getAnnotation(TestAnnotation.class);
            System.out.println("jieguo:" + annotation.name() + "," + annotation.getCode());
        }
        // 获取方法上的注解
        try {
            Class<?> personClass = Class.forName("annotation.Person");
            Method gotoWork = personClass.getMethod("gotoWork", int.class);
            if (gotoWork.isAnnotationPresent(TestAnnotation.class)) {
                TestAnnotation annotation = gotoWork.getAnnotation(TestAnnotation.class);
                System.out.println("method:" + annotation.name() + "," + annotation.getCode());
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

        // 属性上的注解
        Class<?> aClass1 = null;
        try {
            aClass1 = Class.forName("annotation.Person");
        // name 在person中是public 修饰的属性,可以用aClass1.getField("name");
       // 如果name不是用public修饰的,需要用getDeclaredField,他可以获取person中的所有的属性,找到name
            Field name = aClass1.getField("name");
            if (name.isAnnotationPresent(TestAnnotation.class)) {
                TestAnnotation annotation = name.getAnnotation(TestAnnotation.class);
                System.out.println("feild:" + annotation.name() + "," + annotation.getCode());
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (NoSuchFieldException ex) {
            ex.printStackTrace();
        }

    }
}

一,注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。

@Inherited
表明使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解

public @interface CherryAnnotation {
public String name();
int age() default 18;
int[] array();
}

注解里面定义的是:注解类型元素!
定义注解类型元素时需要注意如下几点:

看到了一个非常详细的注解的讲解,我就不再写了:https://blog.csdn.net/xsp_happyboy/article/details/80987484

三,注解需要掌握的基本方法
1.放射:Class.forName("annotation.Person");
2.personClass.getMethod,通过反射获取Method
3.getDeclaredField("name")/getField("name"),获取属性Field
4.getAnnotation(TestAnnotation.class);获取指定的注解
5.getAnnotations();获取该类/方法/属性上的所有的注解

上一篇 下一篇

猜你喜欢

热点阅读