检索Java注释属性

时间:2009-11-26 19:00:57

标签: java annotations

如何在带注释的方法上检索注释的值??

我有:

@myAnnotation(attribute1 = value1, attibute2 = value2)
public void myMethod()
{
  //I want to get value1 here
}

4 个答案:

答案 0 :(得分:51)

  1. 获取Method个实例。
  2. 获取注释。
  3. 获取注释属性值。
  4. 类似的东西:

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

    当然,您需要捕获/处理适当的异常。以上假设您确实正在从当前类中检索方法(否则将getClass()替换为Class.forName())并且所讨论的方法是公开的(如果不是这样则使用getDeclaredMethods()

答案 1 :(得分:22)

两件重要的事情:

  • 无法获取当前方法,例如没有getMethod(),例如getClass()。因此,访问其自己的注释的方法需要知道自己的名称。
  • 注释的保留策略必须设置为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());
}

答案 2 :(得分:2)

要获取当前方法,请尝试使用以下代码:

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

答案 3 :(得分:1)

@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;
    }
}

[编辑:感谢/感谢Alexandr Priymak在main()中发现错误