注解是来解释程序的,但不是给程序员看的,而是给计算机看的。如之前提到的@override 注解本质上是一个接口,该接口默认继承Annotation接口。 JDK中具有内置的注解,也可以自定义注解。 一、 内置注解 二、自定义注解 1. 自定义注解: 格式: 元注解 public @interface 注解名称 { } 2.因为注解是继承了Annotaion接口的接口,可以在其中定义方法,方法的返回类型可以为基本数据类型、String、枚举、注解和以上类型的数组(不能为void),注解中定义的抽象方法称为属性,使用注解时要给属性赋值,多个值用逗号隔开,若有默认值可以不赋值。数组赋值用{},如果数组只有一个元素可以省略{}。 例: 再如: 再如: 注意:如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接写值。例如:
三、元注解:用于描述注解的注解,JDK已定义好 1.@Target 先看@Target源码,观察它的属性 它的属性是ElementType类型的数组,Element源码如下(一个枚举类): 下例注解可以作用在类、方法和成员变量上:
2.@Retention:用于描述注解被保留的阶段,包括三个阶段 源码: RetentionPolicy也是枚举类型:SOURCE表示.java源码阶段留有,CLASS表示注解会被保存到.class字节码文件,RUNTIME表示Java虚拟机可以读取到该注解 下例表示Java虚拟机可以读取到@MyAnno3注解: 3.@Inherited:表示注解是否被继承 例如:
Teacher类默认加上Worker类上加的可继承(被@Inherited修饰)的@MyAnnoa3注解
4.解析(使用)注解 注解可以替代配置文件的功能 如下例:自定义一个注解Pro,包含className属性和methodName属性 将自定义的@Pro修饰类ReflectTest并给注解中的属性传值 下面这张照片是类ReflectTest的类体: 在被@Pro修饰的ReflectTest类中,先获取了该类字节码文件中的Class对象reflectTestClass,然后通过调用getAnnotation()方法来在内存中生成该注解接口的子类实现对象an,这个对象就可以调用@Pro中的属性,而属性的值即使ReflectTest类上注解里赋的值。 运行结果: 如果要修改输出结果不用修改类中的内容,修改注解中传的值即可。
|