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

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

注:あちこちでキャストが必要になる場合があります。IDEが手元にありません。

その他の例については、次を参照してください。

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

そしてここ:

Javaで注釈の値を読み取ることは可能ですか?

于 2012-06-21T09:41:26.107 に答える
-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 に答える