注釈付きメソッドで注釈の値を取得するにはどうすればよいですか?
私が持っています:
@myAnnotation(attribute1 = value1, attibute2 = value2)
public void myMethod()
{
//I want to get value1 here
}
Method
インスタンスを取得します。何かのようなもの:
_Method m = getClass().getMethod("myMethod");
MyAnnotation a = m.getAnnotation(MyAnnotation.class);
MyValueType value1 = a.attribute1();
_
もちろん、適切な例外をキャッチ/処理する必要があります。上記は、実際に現在のクラスからメソッドを取得していることを前提とし(そうでない場合はgetClass()
をClass.forName()
に置き換えます)、問題のメソッドはpublicです(そうでない場合はgetDeclaredMethods()
を使用します)ケース)
2つの重要なこと:
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;
}
}
[編集:main()のエラーを発見してくれたAlexandr Priymakに感謝/感謝]