Java运行时注释在内部是如何工作的?
我知道编译时注释功能,注释处理器运行,反射API使用。但我不确定JVM是如何得到有关运行时注释的通知的。注释处理器在这里也起作用吗?它们作为元数据存储在Java运行时注释在内部是如何工作的?,java,annotations,jvm,Java,Annotations,Jvm,我知道编译时注释功能,注释处理器运行,反射API使用。但我不确定JVM是如何得到有关运行时注释的通知的。注释处理器在这里也起作用吗?它们作为元数据存储在.class文件中。您可以阅读官方文档了解详细信息:使用元注释@RetentionvalueRetentionPolicy.RUNTIME,JVM保留标记的注释,以便运行时环境可以使用它。这将允许在运行时检查注释信息(元数据) 这方面的一个示例声明是: package annotations; import java.lang.annotati
.class
文件中。您可以阅读官方文档了解详细信息:使用元注释@Retention
valueRetentionPolicy.RUNTIME
,JVM保留标记的注释,以便运行时环境可以使用它。这将允许在运行时检查注释信息(元数据)
这方面的一个示例声明是:
package annotations;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Developer {
String value();
}
运行时
值名称本身表示,当保留值为“Runtime”时,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();
}
}
}
}
}
输出方法“publicstaticvoidannotations.MyClassImpl.connect2Exchange(java.net.Socket)”中的注释:@annotations.Developer(value=droy)
开发者名称:droy谢谢,但我不确定运行时注释是如何工作的。与编译时注释的方式相同吗?使用Java反射,您可以在运行时访问附加到Java类的注释。好的,那么JVM也使用反射吗?似乎是这样