【问题标题】:Finding an annotation in a list在列表中查找注释
【发布时间】:2012-05-13 21:41:02
【问题描述】:

在我的代码中,我可能在方法或字段上定义了注释,因此我正在检查类中的方法和字段,并将所有注释存储在单独的列表中。

后来我有一个方法叫做getAnnotation。

Annotation getAnnotation(Class annotationClass) {
    for (Annotation annotation : annotations) {
        if (annotation.getClass().equals(annotationClass)) {
            return annotation;
        }
    }
    return null;
}

我这样称呼它:

Annotation annotation = getAnnotation(MyAnnotation.class);

问题在于 getAnnotation 方法与类名不匹配。当我调试时,我看到注释显示为代理对象。在这种情况下如何找到我想要的特定注释?

TIA

我这样定义地图:

Map<Class<? extends Annotation>, Annotation> annotations = new HashMap<Class<? extends Annotation>, Annotation>(4);

我这样填充地图:

Annotation[] annotations = method.getAnnotations();
for (Annotation annotation : annotations) {
  annotations.put(annotation.getClass(), annotation);
}

【问题讨论】:

    标签: java reflection annotations


    【解决方案1】:

    您最好填写 Map&lt;Class&lt;? extends Annotation&gt;, Annotation&gt; - 这样查找将是 O(1),并且您不会关心它是否是代理。

    【讨论】:

    • 好主意。现在我在 keySet 和 values 上都看到了代理。 :(
    • 确定检查编辑。我认为这是因为我从反射中获得了这些注释,因此它们以某种方式被代理,
    • 好吧,我不认为你可以代理Class。这是final。你怎么知道它是代理?
    • 当我调试类名看起来像这样:$Proxy3 而不是实际的类名。
    【解决方案2】:

    耶!我想到了。 Annotation 对象有一个“annotationType()”方法来返回真实的类名。

    所以任何有兴趣的人的代码应该是这样的:

    Map, Annotation> annotations = new HashMap, Annotation>(4);

    Annotation[] annos = method.getAnnotations();
    for (Annotation anno : annos) {
        annotations.put(anno.annotationType(), annotation);
    }
    

    然后类匹配工作正常。

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多