处理注解
360字约1分钟
2024-08-08
根据@Retention
的配置可以知道,Java的注解本身对代码逻辑没有任何影响
SOURCE
类型的注解在编译期就被丢掉了CLASS
类型的注解仅保存在class文件中,它们不会被加载进JVMRUNTIME
类型的注解会被加载进JVM,并且在运行期可以被程序读取
如何使用注解完全由工具决定。SOURCE类型的注解主要由编译器使用,因此我们一般只使用,不编写。CLASS类型的注解主要由底层工具库使用,涉及到class的加载,一般我们很少用到。只有RUNTIME类型的注解不但要使用,还经常需要编写
API
因为注解定义后也是一种class,所有的注解都继承自java.lang.annotation.Annotation,因此,读取注解,需要使用反射API
判断某个注解是否存在于 Class、Field、Method 或 Constructor
Class.isAnnotationPresent(Class)
Field.isAnnotationPresent(Class)
Method.isAnnotationPresent(Class)
Constructor.isAnnotationPresent(Class)
使用反射API读取Annotation
Class.getAnnotation(Class)
Field.getAnnotation(Class)
Method.getAnnotation(Class)
Constructor.getAnnotation(Class)
栗子
定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Report {
String value() default "";
}
使用注解
@Report("personReport")
public class Person {
}
测试
public static void main(String[] args) {
// 判断 Person 类是否存在 @Report 注解
boolean annotationPresent = Person.class.isAnnotationPresent(Report.class);
System.out.println(annotationPresent); // true
// 获取 Person 定义的 @Report 注解
Report report = Person.class.getAnnotation(Report.class);
System.out.println(report); // @com.marui.reflection.Report(value=personReport)
// 获取定义注解的 value 值
System.out.println(report.value()); // personReport
}