当前位置: 首页 > 图灵资讯 > 技术篇> java注解

java注解

来源:图灵教育
时间:2023-12-05 17:06:18

(注释)java代码中的特殊标记,如@Override,@Test等注释可用于类、构造器、方法、成员变量、参数等位置:允许其他程序根据注释信息决定如何执行程序

1. 自定义注解

image.png

public @interface ZyTest {    String description() default "woc,op------------------------";    int[] aaa();}

image.png特殊属性名:特殊属性名:

  • 如果注释中只有一个value属性,使用注释时可以不写value名称
2. 注解的原理

image.png注释的本质是一个接口,Java中所有的注释都继承了Annotation接口

  • @注解(...):事实上,它是一个实现注释和Annotation接口的实现对象
3. 元注解

指修饰注解的注解,常见@Target,@Retention

3.1. @Target

声明只能在哪里使用修改后的注释

  1. TYPE,类,接口
  2. FIELD,成员变量
  3. METHOD,成员方法
  4. PARAMETER,方法参数
  5. CONSTRUCTOR,构造器
  6. LOCAL_VARIABLE,局部变量

例如,现在的设计只能在类上和成员方法上使用这个注释

@Target({ElementType.TYPE,ElementType.METHOD})// 类上和成员方法上只能使用修改后的注释 @interface ZyTest2 {}

当成员变量发挥作用时,可以看到报错了。image.png

3.2. @Retention

声明注释的保留周期

  1. SOURCE
  • 只作用于源代码阶段,字节码不存在
  1. CLASS(默认值)
  • 保留到字节码阶段,运行阶段不存在
  1. RUNTIME(常用开发)
  • 一直保留到运行阶段

如。image.png

@Retention(RetentionPolicy.RUNTIME)// 指定注释的有效范围为publicic,直至运行 @interface ZyTest2 {}
4. 注解的解析

判断类别、方法和成员变量上是否有注释,并分析注释中的内容

如何分析注解:

  • 指导思想:要分析谁上面的注释,首先要得到谁
  • 例如,如果要分析类别上的注释,应首先获得类别的Class对象,然后通过Class对象分析其上的注释
  • 例如,如果要分析成员方法中的注释,则应获得成员方法中的Method对象,然后通过Method对象分析上述注释
  • Class、Method、Field、Constructor,Annnotatedelement接口已经实现,它们都有分析和注释的能力。

image.png

案例:image.png注解,

@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属性    }}

image.png