Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何访问注释实例中的注释参数_Java_Annotations - Fatal编程技术网

Java 如何访问注释实例中的注释参数

Java 如何访问注释实例中的注释参数,java,annotations,Java,Annotations,如果在字段上使用参数化注释,字段引用的对象是否可以访问注释参数 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Classy { Class<?> klazz(); } 假设访问: class Foo{ private Class<?> klazz = String.class; private void useAnno

如果在字段上使用参数化注释,字段引用的对象是否可以访问注释参数

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

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

  private void useAnnotationParameterIfAvailable(){
    klazz = what goes here?
  }
}
class-Foo{
私有类klazz=String.Class;
私有void useAnnotationParameterIfAvailable(){
klazz=这里有什么?
}
}

谢谢

在目标场上使用以下方法

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

注意:可能需要一些铸造这里和那里,我没有一个IDE手边

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

在这里:


否-注释是字段的一个属性,对象无法迭代当前引用它的字段(为了高效地查找字段,JVM必须维护一个专用的查找数据结构,并在每次字段分配时更新它。这将非常昂贵…)


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

谢谢Vijay,但恐怕您误解了这些要求——您描述的是如何从包含字段的类而不是从字段实例本身访问注释。也就是说,-代码不能从
Foo
内部使用,谢谢Istvan-我担心您的方法无法工作,因为
Foo
类本身没有注释,只有另一个类中类型为
Foo
的字段
class.getAnnotation()
将始终返回
null
。是的,我认为类本身已被注释,抱歉。我明白了。听起来很有道理。否则就太容易了:)谢谢你,梅里顿。
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();
    }