如何在aspectj中访问私有变量

时间:2013-11-23 23:24:22

标签: java tomcat jersey aspectj

所以我有一个场景,我想在使用jersey编写的RESTful Web服务中访问上下文变量。

 @Path("hello")
 public class Hello {

 @Context
 private UriInfo context;

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

在我使用@Around切入点的方面,我可以看到参数是ARGS:[org.glassfish.jersey.internal.inject.RequestInjectee@7d9d679,org.apache.catalina.connector.RequestFacade@6e8fa5f5],因此我可以轻松访问Request对象。

我的方面如下:

@Pointcut("execution(* *.getHtml(..))")
public void methodCall() {}

@Around("methodCall()") 
public Object aroundMethodCall(ProceedingJoinPoint pjp) throws Throwable {
    System.out.println("AROUND" + pjp.getSignature());
    System.out.println("ARGS: "+ Arrays.toString(pjp.getArgs()));
    return pjp.proceed();
}

我想在我的方面访问context变量(记录它)。在我的方面,getThis()方法返回Hello类,但上下文字段是私有的。可能吗 ?我正在使用加载时间编织。

1 个答案:

答案 0 :(得分:2)

如果您的Object引用为obj,那么您将需要执行几个步骤,然后您可以尝试

Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField("context");
field.setAccessible(true);
UriInfo context = (UriInfo) field.get(obj);