注解

作者: Java酸不酸 | 来源:发表于2018-05-13 11:04 被阅读2次

    jdk中三种常见的注解:(注解与类、接口平级存在)

    1. Override:用于描述方法重写,描述该方法是从父类继承的
    2. SuppressWarnings:压制警告的意思
    3. Deprecated:用于描述方法过期了

    注解属性的类型可以是哪些?

    1. 基本数据类型都可以:byte、short、int、long、float、double、char、boolean
    2. String
    3. 注解类型
    4. Class类型
    5. 枚举类型
    6. 以上类型的一维数组
    @Retention(value = RetentionPolicy.RUNTIME)
    public @interface MyAnnotation02 {
        String str();
        int num() default 10;
        MyAnnotation01 anno();
        Class clazz();
        Color color();
        String[] value();
    }
    

    使用注解

    如果使用的那个注解有注解属性,那么使用的时候就要为这些注解属性赋值。

    @MyAnnotation02(anno = @MyAnnotation01, clazz = TestAnno03.class, color = Color.GREEN, str = "qwe", value = { "asd" })
    public class TestAnno03 {
        @MyAnnotation03(value = "qwe")
        public String name = "张三";
        
        @MyAnnotation03(value = "qwe")
        public TestAnno03() {
        }
        
        @MyAnnotation03(value = "qwe")
        @MyAnnotation01
        public void fn1(){
            @MyAnnotation03(value = "qwe")
            int num = 20;
        }
    }
    

    元注解就是定义在注解上的注解

    • @ Target:表示该注解能使用在什么东西上面

      • 如果取值为:METHOD表示可以用在方法上,TYPE表示可以用在类、接口、注解、枚举上
      • LOCAL_VARIABLE表示可以用在局部变量上,
      • FIELD表示可以用在成员变量上
      • CONSTRUCTOR表示能够用在构造函数上
    • @ Retention:表示该注解保留到什么阶段

      • SOURCE:源码阶段
      • CLASS:编译阶段
      • RUNTIME:运行阶段
    @Retention(value = RetentionPolicy.RUNTIME)
    @Target(value = { ElementType.METHOD,ElementType.TYPE,ElementType.LOCAL_VARIABLE,ElementType.FIELD,ElementType.CONSTRUCTOR })
    public @interface MyAnnotation03 {
        String value();
    }
    

    解析注解

    • 获取TestAnno03类上的所有注解 -> Annotation[]
    // 获取该类字节码文件对象,Class类实现了AnnotatedElement接口,所以就有该接口的的那四个方法
    Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
    Annotation[] annotations = clazz.getAnnotations();
    
    • 判断name成员变量上有没有@MyAnnotation03注解 -> boolean
    // 获取字节码文件对象
    Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
    // 获取所有的字段
    Field field = clazz.getField("name");
    boolean flag = field.isAnnotationPresent(MyAnnotation03.class);
    System.out.println(flag);
    
    • 获取fn1方法上的MyAnnotation01注解的对象
    Class<?> clazz = Class.forName("com.itheima.annotation.meta.TestAnno03");
    //获取fn1方法
    Method method = clazz.getMethod("fn1");
            
    MyAnnotation01 annotation = method.getAnnotation(MyAnnotation01.class);
    System.out.println(annotation);
    
    

    相关文章

      网友评论

        本文标题:注解

        本文链接:https://www.haomeiwen.com/subject/oinhdftx.html