Java 注释返回神秘的类名

2022-09-03 01:03:10

我对Java有点陌生,所以也许我误解了Java中注释的用例。我的问题如下:

对方法进行批注后,我在检查方法上的批注时会收到类名,例如 $Proxy 31。我很好奇为什么我会收到与此类似的注释的类名,以及我能做些什么来解决这个问题。

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName());
RequiredPermission a = m.getAnnotation(RequiredPermission.class);

这将返回一个空注释,即使我知道它正在查找的方法已实现 RequiredPermission 注释。

for(Annotation a : m.getAnnotations())
{
    System.out.println(a.getClass().getName());
}

这将打印出 $Proxy 31 类名。


答案 1

给定 Annotation a,您需要调用 annotationType(),而不是 getClass() 来确定注释的类型。Annotation 对象只是一个代理,它表示该类上的注释实例。

Object o = ...;
Class c = o.getClass();
Annotation[] as = c.getAnnotations();
for (Annotation a : as) {
   // prints out the proxy class name
   System.out.println(a.getClass().getName());
   // prints out the name of the actual annotation
   System.out.println(a.annotationType().getName());
}

答案 2

当您在源代码中添加注释时,Java实际上会在“引擎盖下”创建一堆接口和类,以允许您(或您的工具)使用限制向程序询问有关注释的信息。方法注释创建“dyanmic代理”,因此Java会为您创建类,可能名为Proxy。

如果您对此感兴趣,请阅读java.lang.reflect.InvocationHandler及其子类型NotementInvocationHandler。

话虽如此,你不必担心Java实际生成了什么。我怀疑你没有正确地使用反射来检查Java程序中的注释。


推荐