我知道编译时注解的功能,其中会运行注解处理器并使用反射API。但是我不确定JVM在运行时注解方面如何被通知。这里注解处理器也发挥作用吗?
我知道编译时注解的功能,其中会运行注解处理器并使用反射API。但是我不确定JVM在运行时注解方面如何被通知。这里注解处理器也发挥作用吗?
@Retention
的值RetentionPolicy.RUNTIME
,被标记的注释将由JVM保留,以便可以被运行时环境使用。这将允许在运行时检查注释信息(元数据)是否可用。package annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Developer {
String value();
}
运行时 这个值的名称本身就说明了,当保留值为“运行时”时,该注释将在JVM运行时可用。我们可以使用反射包编写自定义代码并解析注释。
它如何使用?
package annotations;
import java.net.Socket;
public class MyClassImpl {
@Developer("droy")
public static void connect2Exchange(Socket sock) {
// do something here
System.out.println("Demonstration example for Runtime annotations");
}
}
package annotations;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
public class TestRuntimeAnnotation {
public static void main(String args[]) throws SecurityException,
ClassNotFoundException {
for (Method method : Class.forName("annotations.MyClassImpl").getMethods()) {
if(method.isAnnotationPresent(annotations.Developer.class)){
try {
for (Annotation anno : method.getDeclaredAnnotations()) {
System.out.println("Annotation in Method '" + method + "' : " + anno);
Developer a = method.getAnnotation(Developer.class);
System.out.println("Developer Name:" + a.value());
}
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}
}
}
输出
在方法 'public static void annotations.MyClassImpl.connect2Exchange(java.net.Socket)' 中的注释:@annotations.Developer(value=droy)
开发者姓名:droy
它们以元数据的形式存储在.class
文件中。您可以阅读官方文档了解详细信息:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.15