(注释)java代码中的特殊标记,如@Override,@Test等注释可用于类、构造器、方法、成员变量、参数等位置:允许其他程序根据注释信息决定如何执行程序
1. 自定义注解public @interface ZyTest { String description() default "woc,op------------------------"; int[] aaa();}
特殊属性名:特殊属性名:
- 如果注释中只有一个value属性,使用注释时可以不写value名称
注释的本质是一个接口,Java中所有的注释都继承了Annotation接口
- @注解(...):事实上,它是一个实现注释和Annotation接口的实现对象
指修饰注解的注解,常见@Target,@Retention
3.1. @Target声明只能在哪里使用修改后的注释
- TYPE,类,接口
- FIELD,成员变量
- METHOD,成员方法
- PARAMETER,方法参数
- CONSTRUCTOR,构造器
- LOCAL_VARIABLE,局部变量
例如,现在的设计只能在类上和成员方法上使用这个注释
@Target({ElementType.TYPE,ElementType.METHOD})// 类上和成员方法上只能使用修改后的注释 @interface ZyTest2 {}
当成员变量发挥作用时,可以看到报错了。
3.2. @Retention声明注释的保留周期
- SOURCE
- 只作用于源代码阶段,字节码不存在
- CLASS(默认值)
- 保留到字节码阶段,运行阶段不存在
- RUNTIME(常用开发)
- 一直保留到运行阶段
如。
@Retention(RetentionPolicy.RUNTIME)// 指定注释的有效范围为publicic,直至运行 @interface ZyTest2 {}
4. 注解的解析判断类别、方法和成员变量上是否有注释,并分析注释中的内容
如何分析注解:
- 指导思想:要分析谁上面的注释,首先要得到谁
- 例如,如果要分析类别上的注释,应首先获得类别的Class对象,然后通过Class对象分析其上的注释
- 例如,如果要分析成员方法中的注释,则应获得成员方法中的Method对象,然后通过Method对象分析上述注释
- Class、Method、Field、Constructor,Annnotatedelement接口已经实现,它们都有分析和注释的能力。
案例:注解,
@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface ZyTest3 { String value(); double aaa() default 100; String[] bbb();}
Demo类,
@ZyTest3(value = "zy",aaa = 512.2,bbb = {"I","love","lh"})public class Demo { @ZyTest3(value = "lh",aaa = 99.9,bbb = {"What","did","I","do?"}) public void ()test1()
Annnotationtest类,
public class AnnotationTest { public static void main(String[] args) throws NoSuchMethodException { Demo demo = new Demo();////创建Demo对象 Class<? extends Demo> demoClass = demo.getClass();///获得democlass对象 System.out.println(demoClass.isAnnotationPresent(Zytest3.class));///调用方法判断demo类中是否有Zytest3注释 Method test1 = demoClass.getDeclaredMethod("test1");////获得test1方法对象 ZyTest3 zyTest3 = test1.getDeclaredAnnotation(Zytest3.class);////在test1方法上获取注释对象 System.out.println(Arrays.toString(zytest3.bbb()));///在获取注释上获取bbb属性 }}