如何获取被指定Annotation注释的所有类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取被指定Annotation注释的所有类相关的知识,希望对你有一定的参考价值。

参考技术A 只有被指定为@Retention(RetentionPolicy.RUNTIME)的才可以用反射的方式获取。

@NewAnnotationType
public class NewClass
public void DoSomething()


获取注解:
Class newClass = NewClass.class;

for (Annotation annotation : newClass.getDeclaredAnnotations())
System.out.println(annotation.toString());

注释(Annotation)

注释可以在编译、类加载、运行时被读取,并执行相应的处理。Annotation可以像修饰符一样使用,可以修饰包、类、构造器、方法、成员变量;、参数、局部变量。访问和处理Annotation的工具成为APT。

1)基本Annotation

  @Override @Deprecated @SuppressWarnings

① 限定重写父类方法:@Override

用来指定方法重写,可以强制子类覆盖父类的方法。程序编译时会告诉编译器检查这个方法,如果没有被重写,则会编译出错。

② 标示已过时:@Deprecated

用于表示某个程序元素(类、方法等)已过时,当其他程序使用已过时的类、方法时,编译器将会给出警告 。

③ 抑制编译器警告:@SuppressWarnings

指示被Annotation标识的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告。

2)自定义Annotation

定义新的Annotation类型使用@interface关键字,如:

//定义一个简单的Annotation类型
public
@interface Test

之后便可以在程序的任何地方来使用该Annotation,通常可用于修饰程序中的类、方法、变量、接口等。

Annotation可以带成员变量,成员变量在Annotation定义中以无参数方法的形式来声明,其方法名和返回值定义了该成员变量的名字和类型,如:

public @interface Test
    //定义两个成员变量的Annotation
    //Annotation中的成员变量以方法的形式来定义
    String name();
    int age();

可以看出,Annotation和接口定义非常相像。如果Annotation里定义了成员变量之后,使用该Annotation时应该为成员变量指定值。可以在定义Annotation的成员变量时指定初始值,利用default关键字,如:

public @interface Test
    //定义两个成员变量的Annotation
    //Annotation中的成员变量以default指定初始值
    String name() default "xx";
    int age() default 32;

指定默认值后,便可以直接使用默认值,无须指定成员变量的值。如果定义的Annotation类型里只有一个value成员变量时,可以直接在Annotation后的括号里指定value成员变量的值,无须使用name=value形式。

利用Annotation可以借助反射工具,实现相应的绑定、测试等功能。

3)JDK的元Annotation

① @Retention

用于指定该Annotation可以保留多长时间,可取值有:

RetentionPolicy.CLASS:编译器将把注释记录在class文件中,当运行java程序时,JVM不再保留注释,这是默认值。

RetentionPolicy.RUNTIME:编译器将把注释记录在class文件中,当运行java程序时,JVM保留注释,程序可以通过反编译获取该注释。

RetentionPolicy.SOURCE:编译器直接丢掉这种策略的注释。

② @Target

用于指定Annotation能用于修饰哪些程序元素,其值有:

ElementType.ANNOTATION_TYPE:只能修饰Annotation

ElementType.CONSTRUCTOR:修饰构造器

ElementType.FIELD:修饰成员变量

ElementType.LOCAL_VARIABLE:只能修饰局部变量

ElementType.METHOD:只能修饰方法

ElementType.PACKAGE:只能修饰包

ElementType.PARAMETER:修饰参数

ElementType.TYPE:可以修饰类、接口(包括注释类型)、枚举。

③ @Documented

表示Annotation类将被javadoc工具提取成文档

④ @Inherited

表示Annotation具有继承性:如果某个类使用了A Annotation(使用@Inherited修饰)修饰,则其子类将自动具有A注释。

4)应用

Android ButterKnife

项目编译时对源代码进行扫描检测找出存活时间为RetentionPolicy.CLASS的指定注解,然后对注解进行解析处理,进而得到要生成的类的必要信息,然后根据这些信息动态生成对应的 java 类,由于它是在编译时对注解进行解析完成相关代码的生成,所以在项目编译时会略耗时,但不会影响运行时的性能。

以上是关于如何获取被指定Annotation注释的所有类的主要内容,如果未能解决你的问题,请参考以下文章

注解和反射的demo

java反射机制 怎样获取到类上面的注解

使用 proguard 保留特定注释

hibernate中使用annotation映射的时候,如何指定实体类中的某些字段不映射到数据库?

使用注释拉出所有字段(包括另一个对象内的字段和内部类中的字段)

Annotation注释笔记