注解

注解属性用法

class MyAnnotationTest {
    // 如果一个注解中有属性,那么必须给属性赋值,如果数组中只有一个元素,可以省略{}
    @MyAnnotation(name="Apple", color="red", int_test = 22)
    void doSome() throws Exception {
        // 反射获取这个类
        Class c = Class.forName("cn.study.test.MyAnnotationTest");
        // 反射获取这个方法
        Method doSomeMethod = c.getDeclaredMethod("doSome");
        // 判断类上面是否有MyAnnotation
        if(c.isAnnotationPresent(MyAnnotation.class)){
            // 获取该注解对象
            MyAnnotation ma = (MyAnnotation)c.getAnnotation(MyAnnotation.class);
            // 获取注解对象的属性
            String name = ma.name();
        }
    }

    // 如果只有一个需定义属性的叫value,等号前可以省略
    @MyAnnotation2("Hello")
    void doOther(){
    }
}

// 自定义注解
@interface MyAnnotation {
    // 这个看着像方法,但实际称之为注解的属性
    // 属性的类型可以使:byte short int long float double boolean char String Class 枚举以及以上每一种的数组形式
    String name();
    String color();
    int age() default 25;  // 属性指定默认值,注解上可以不写该属性
    int[] int_test();  // 如果数组中只有一个元素,可以省略{}
}

@interface MyAnnotation2 {
    String value();  // 如果属性叫value,等号前可以省略
    int age() default 20;
}

元注解

用来标注“注解类型”的“注解”就是元注解

常见元注解:

  • Target:用来标注该注解类型能出现在什么位置上,比如Override的注解为@Target(ElementType.METHOD),意为只能在方法上使用该注解类型
  • Retention:用来标注该注解类型最终保存在哪:
    • @Retention(RetentionPolicy.SOURCE):表示该注解只被保留在java源文件中
    • @Retention(RetentionPolicy.CLASS):保存在class文件中
    • @Retention(RetentionPolicy.RUNTIME):保存在class文件中并且可以被反射机制获取到
  • Deprecated:用来标注该注解类型标注的对象已经过时,不推荐使用该对象,使用时会出点划线表示该方法已过时,源码中@Deprecated(since="9")意为从JDK9开始过时

个人理解

现在还没接触到用到注解的项目,不过除了标签的功能外,也可以实现一定的数据驱动功能,做一些参数调试。

Q.E.D.


刚毕业走上社会被毒打的搬砖狗