1

如果我有一个在字段上使用的参数化注释,该字段引用的对象可以访问注释参数吗?

 @Retention(RetentionPolicy.RUNTIME)
  @Target(ElementType.FIELD)
  public @interface Classy {
      Class<?> klazz();
  }

用法:

class Bar{
    @Classy(klazz=Integer.class)
    Foo foo;
    ...
}

假设访问:

class  Foo{
  private Class<?> klazz = String.class;

  private void useAnnotationParameterIfAvailable(){
    klazz = what goes here?
  }
}

谢谢

4

3 回答 3

2

否 - 注释是字段的属性,对象不能迭代当前引用它的字段(为了有效地查找字段,JVM 必须维护专用的查找数据结构,并在每次字段分配时更新它。这将会很贵...)

当然,如果对象的类型唯一标识了字段,您可以使用类路径扫描来查找该类型的所有带注释的字段 - 但如果类型标识要使用的类,则将注释放在类型上会容易得多: -)

于 2012-06-21T09:50:31.033 回答
-1

在目标字段上使用以下方法。

java.lang.reflect.Field.getAnnotation(Class<T>)

示例代码

    try {
        Field field = this.getClass().getField("foo");
        Ignore annotation = field.getAnnotation(Classy.class);

        //do what ever with annotation
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
于 2012-06-21T09:38:45.203 回答
-1

Foo.class.getAnnotation(Classy.class).klazz();

注意:可能需要在这里和那里进行一些转换,我手边没有 IDE。

有关更多示例,请参见此处:

http://tutorials.jenkov.com/java-reflection/annotations.html

和这里:

是否可以在java中读取注释的值?

于 2012-06-21T09:41:26.107 回答