【问题标题】:Get value of a parameter of an annotation in Java获取Java中注释的参数值
【发布时间】:2013-11-25 12:00:59
【问题描述】:

所以我有一个代码:

@Path("/foo")
public class Hello {

@GET
@Produces("text/html")
public String getHtml(@Context Request request, @Context HttpServletRequest requestss){
  ...
}

我正在使用 AspectJ 来捕获对 getHtml 方法的所有调用。我想在我的建议中将参数传递给@Produces@Path,即在这种情况下为"/foo""text/html"。如何使用反射来做到这一点?

【问题讨论】:

    标签: java reflection aspectj


    【解决方案1】:

    获取@Path参数的值:

    String path = Hello.class.getAnnotation(Path.class).value();
    

    同样,一旦你掌握了MethodgetHtml

    Method m = Hello.class.getMethod("getHtml", ..);
    String mime = m.getAnnotation(Produces.class).value;
    

    【讨论】:

    • 好的,所以第一个例子没问题,但有.value() 而不是.value。第二个不起作用,因为 Annotation 类没有 value() 方法。
    • 第二个有效,但正如@Vash 所示: MethodSignature ms = (MethodSignature) pjp.getSignature();方法 m = ms.getMethod();生产 pro = m.getAnnotation(Produces.class);
    • 我怎样才能得到@Annotation(param1="One", param2="THIS") ?
    • @NinjaCoding 假设您在方法上使用了注解,一旦您持有方法对象,就可以使用 method.getAnnotation(Annotation.class).param1() 来获取 param1 值。在这里,您已将注释接口命名为 Annotation。
    【解决方案2】:

    注解是基于接口逻辑的。您需要调用它的有效成员来检索值。

    定义

    public @interface Produces {
     String type();
    }
    

    阅读示例

    for (Method m: SomeClass.class.getMethods() {
       Produces produce = m.getAnnotation(Produces.class);
       if (produce != null)
           System.out.println(produce.type());
    }
    

    是的。您必须使用反射来访问方法定义。可以使用Class#MgetMethods()获取方法的定义

    对于您调用obj.getClass() 来获取类定义的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多