質問

注釈付きメソッドで注釈の値を取得するにはどうすればよいですか?

私は持っています:

@myAnnotation(attribute1 = value1, attibute2 = value2)
public void myMethod()
{
  //I want to get value1 here
}
役に立ちましたか?

解決

  1. 取得 メソッド インスタンス。
  2. 注釈を取得します。
  3. 注釈属性値を取得します。

次のようなもの:

Method m = getClass().getMethod("myMethod");
MyAnnotation a = m.getAnnotation(MyAnnotation.class);
MyValueType value1 = a.attribute1();

もちろん、適切な例外をキャッチ/処理する必要があります。上記は、実際に現在のクラスからメソッドを取得し( getClass() Class.forName()に置き換える)、問題のメソッドがpublic(そうでない場合はgetDeclaredMethods()

他のヒント

2つの重要なこと:

  • 現在のメソッドを取得する方法はありません。 getClass()などのgetMethod()はありません。したがって、独自の注釈にアクセスするメソッドは、独自の名前を知る必要があります。
  • 注釈の保持ポリシー RUNTIME に設定する必要があります。これにより、実行時に注釈にアクセスできます。デフォルトはコンパイル時です。つまり、アノテーションはクラスファイルで使用できますが、実行時にリフレクションを使用してアクセスすることはできません。

完全な例:

@Retention(RetentionPolicy.RUNTIME)
public static @interface MyAnnotation {
    String value1();

    int value2();
}

@Test
@MyAnnotation(value1 = "Foo", value2 = 1337)
public void testAnnotation() throws Exception {
    Method[] methods = getClass().getMethods();
    Method method = methods[0];
    assertEquals("testAnnotation", method.getName());
    MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
    assertEquals("Foo", annotation.value1());
    assertEquals(1337, annotation.value2());
}

現在のメソッドを取得するには、次のコードを使用してみてください:

Thread.currentThread().getStackTrace()[1].getClassName().toString()+\".\"+Thread.currentThread().getStackTrace()[1].getMethodName().toString()

@mhaller:投稿へのコメントには長すぎます。明らかに、オーバーロードされたメソッドを処理するためにさらに改良する必要がありますが、不可能ではありません。:

import java.lang.reflect.Method;

public class Hack {
    public static void main (String[] args) {
        (new Hack()).foobar();
    }
    public void foobar () {
        Method here = getCurrentMethod(this);
        System.out.format("And here we are: %s\n", here);
    }
    public static final Method getCurrentMethod(Object o) {
        String s = Thread.currentThread().getStackTrace()[2].getMethodName();
        Method cm = null;
        for(Method m : o.getClass().getMethods()){
            if(m.getName().equals(s)){
                cm = m; break;
            }
        }
        return cm;
    }
}

[edit:main()のエラーを発見してくれたAlexandr Priymakに謝辞/感謝]

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top