JAVA 注解原理
在 Java 项目编译后,注解会以特定的方式存储在 .class 文件中,并可以在运行时通过反射机制进行解析和处理。以下是关于注解在编译后如何存在、以及在运行时如何解析和处理的详细解释:
1. 注解的存储方式
Java 的注解可以有不同的保留策略(Retention Policy),这决定了注解在编译后的 .class 文件中的存储方式以及它们在运行时的可见性。常见的保留策略有三种:
• SOURCE:注解只在源码中存在,编译后不会被保留到 .class 文件中。例如,@Override 就是这样的注解。
• CLASS:注解会被保留到 .class 文件中,但在运行时不可见(即通过反射无法访问到)。这是注解的默认保留策略。
• RUNTIME:注解不仅会被保留到 .class 文件中,而且在运行时可以通过反射机制进行访问。Spring 框架中的大多数注解(如 @Autowired, @RequestMapping 等)都是 RUNTIME 注解。
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
}
2. 运行时如何解析注解
在运行时,Java 通过反射机制来解析和处理注解。反射允许程序动态地检查和操作类的结构,包括类、方法、字段、参数等的注解信息。
获取注解信息的步骤:
1. 获取类的引用:
• 通过 Class<?> clazz = MyClass.class; 或者 Class<?> clazz = object.getClass(); 获取目标类的引用。
2. 获取注解: (下面获取注解的方式,就教反射)
为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?...-CSDN博客
• 可以使用以下方法来获取注解:
• clazz.getAnnotation(MyAnnotation.class):获取类级别的注解。
• method.getAnnotation(MyAnnotation.class):获取方法级别的注解。
• field.getAnnotation(MyAnnotation.class):获取字段级别的注解。
• parameter.getAnnotation(MyAnnotation.class):获取参数级别的注解。
这些方法返回的是注解对象,如果注解不存在,则返回 null。
3. 读取注解属性:
• 通过调用注解对象的方法来读取注解的属性值。例如:
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
if (annotation != null) {
String value = annotation.value();
System.out.println("Annotation value: " + value);
}
-----
自定义注解:
通过 @Retention 定义 注解在java文件中如何保存 。
SOURCE , CLASS , RUNTIME
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
// 注解定义
}