你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

第十二章注解

2021-12-2 19:51:37
  • 注解(标注): jdk1.5新增 1.注释说明的作用 2.标志检查的作用 3.注解可以保留在class文件中,注释不能保存在class文件中 4.配置主键的时候可以通过传递实参,程序中可以通过反射获取到传递的数据进行使用 5.大量的代替了配置文件的存在

  • 使用: @注解名(数据)

  • 位置: 任意位置都能使用(根据需求指定使用位置)

  • 分类: 参数个数分类: 标志注解|标识注解 : 没有参数 单值注解 : 一个参数 完整注解 : 多个参数

  • jdk内置注解 普通注解 : @Override 强制检测被注解的方法是否为重写方法 @Deprecated 标志已过时 @SuppressWarnings("all") 抑制所有警告 @FunctionalInterface 强制检测一个接口是否为函数式接口

  • 元注解 : 注解注解的注解 @Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方) @Retention 用于描述注解的生命周期 一个注解类型的声明周期必须为运行期,才能运行期间通过反射操作 @Documented 表示使用该注解的元素应被javadoc或类似工具文档化 @Inherited 表示一个注解类型会被自动继承 自定义注解

public class Class001_Anno {
    public static void main(String[] args) {
        test();
        List list = new ArrayList();
    }
​
    @Deprecated
    static void test(){
​
        List list = new ArrayList();
        List list2 = new ArrayList();
    }
​
}
​

8.2自定义注解

  • 1.使用@interface定义注解类型

  • 2.定义的注解类型默认隐式的实现了java.lang.annotation.Annotation

  • 3.自定义的注解类型不能显示的继承其他父类以及实现其他接口

  • 4.可以在注解类型的内部提供属性或者字段

  • 5.注解类型中属性的定义 : 数据类型 属性名();

  • 6.注解类型中的属性的数据类型 : 基本数据类型 , String , 枚举类型 , 注解类型 ,或者以上类型的数组

  • 7.如果只有一个属性,建议属性名定义为value,赋值的时候就可以省略属性名=,直接赋值

  • 8.通过default关键字为属性添加一个默认值

@MyAnnotation
public class Class002_DefinedAnnotation {
    @MyAnnotation(12)
    void test(){
​
    }
    public static void main(String[] args) {
​
    }
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD})
@interface MyAnnotation{
    int value() default 1;
}
@interface haha{}

8.2.1注解解析器

  • 注解解析器: 了解 水果清单: 每天上货的水果,以及数量

    注意: 注解需要设置声明周期为运行期才能通过反射操作  @Retention(RetentionPolicy.RUNTIME)
public class Class01_FruitList {
      public static void main(String[] args) throws IllegalAccessException {
            //水果清单
            FruitList f = new FruitList();
            f.apple = 0;
            System.out.println(f);
​
            f = test(f,FruitList.class);
            System.out.println(f);
        }
​
        //通过反射操作注解
        public static FruitList test(FruitList list,Class<FruitList> cls) throws IllegalAccessException {
            //获取FruitList类中所有的属性
            Field[] fields = cls.getDeclaredFields();
            //遍历获取list对象的所有属性值
            for(Field field:fields){
                Object value = field.get(list);
                //遍历判断当前属性值是否为null
                if(value==null){
                    //判断是否存在Num类型的注解修饰
                    if(field.isAnnotationPresent(Num.class)){
                        //获取属性上面的Num注解
                        Num n = field.getAnnotation(Num.class);
                        //为list对象的当前属性赋值
                        field.set(list,n.value());
                    }
                }
            }
            return list;
        }
​
    }
​
    //水果清单
    class FruitList{
        @Num(3)
        Integer apple;
        Integer pair;
        @Num
        Integer banana;
​
        public FruitList() {
        }
​
        public FruitList(int apple, int pair, int banana) {
            this.apple = apple;
            this.pair = pair;
            this.banana = banana;
        }
​
        @Override
        public String toString() {
            return "FruitList{" +
                    "apple=" + apple +
                    ", pair=" + pair +
                    ", banana=" + banana +
                    '}';
        }
    }
​
    //注解 : 标识水果默认的上货数量
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Num{
        int value() default 2;
    }
​