Java运行时注解在内部是如何工作的?

5

我知道编译时注解的功能,其中会运行注解处理器并使用反射API。但是我不确定JVM在运行时注解方面如何被通知。这里注解处理器也发挥作用吗?

2个回答

7
使用元注释@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


谢谢,但我不确定运行时注释是如何工作的。它和编译时注释一样吗? - javaAndBeyond
3
通过Java反射,您可以在运行时访问附加到Java类的注释。 - The Roy
好的,那么JVM也使用反射?看起来是这样。 - javaAndBeyond

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接