获取Java中注释参数的值

Dar*_*rek 30 java reflection aspectj

所以我有一个代码:

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

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

我正在使用AspectJ来捕获对getHtml方法的所有调用.我想获得传递的参数@Produces,并@Path在我的建议,即"/foo""text/html"在这种情况下.我怎么能用反射来做呢?

har*_*rsh 38

要获取@Path参数的值:

String path = Hello.class.getAnnotation(Path.class).value();
Run Code Online (Sandbox Code Playgroud)

同样,一旦掌握了 Method getHtml

Method m = Hello.class.getMethod("getHtml", ..);
String mime = m.getAnnotation(Produces.class).value;
Run Code Online (Sandbox Code Playgroud)

  • 好的,所以第一个例子没问题,但是`.value()`不是`.value`.第二个不起作用,因为Annotation类没有`value()`方法. (3认同)
  • 第二个工作,但正如@Vash所示:MethodSignature ms =(MethodSignature)pjp.getSignature(); 方法m = ms.getMethod(); 生成pro = m.getAnnotation(Produces.class); (2认同)

Dam*_*ash 5

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

定义

public @interface Produces {
 String type();
}
Run Code Online (Sandbox Code Playgroud)

阅读范例

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

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

对于对象,您可以调用obj.getClass()以获取类定义。