Java Runtime注释如何在内部工作?

时间:2016-03-12 15:12:16

标签: java annotations jvm

我知道编译时注释功能,即运行注释处理器并使用反射API。但我不确定JVM如何获得有关运行时注释的通知。注释处理器也可以在这里工作吗?

2 个答案:

答案 0 :(得分:4)

使用元注释@RetentionRetentionPolicy.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();
                }
            }
        }
    }
}

<强>输出
方法&#39; public static void annotations.MyClassImpl.connect2Exchange(java.net.Socket)&#39; :@ annotations.Developer(value = droy)
开发者名称:droy

答案 1 :(得分:1)

它们作为元数据存储在.class个文件中。您可以阅读官方文档了解详细信息:https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.15