【问题标题】:How to access private variable in aspectj如何访问aspectj中的私有变量
【发布时间】:2013-11-23 23:24:22
【问题描述】:

所以我有一个场景,我想访问使用 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],因此我可以轻松访问请求对象。

我的方面如下:

@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 类,但上下文字段是私有的。可能吗 ?我正在使用加载时间编织。

【问题讨论】:

  • 你能在你的 Hello 类中添加一个公共的getContext() 方法吗?否则,无论如何,对于 Java 7 及更高版本,我会查看 MethodHandle
  • @ElliottFrisch 不,我不能,我的想法是不要对球衣应用程序进行侵入式日志记录(不是我写的)
  • @ElliottFrisch 是的 java 7
  • 然后你可以使用MethodHandle
  • @ElliottFrisch MethodHandle 的问题是我需要知道类型并在使用前导入它。在我的场景中,我将在执行期间学习类型。

标签: java tomcat jersey aspectj


【解决方案1】:

您需要执行几个步骤,假设您的 Object 参考是 obj,那么您可以尝试

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

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多