2013-11-23 42 views
2

所以我有一個場景,我想在使用球衣編寫的REST風格的Web服務中訪問上下文變量。如何訪問aspectj中的私有變量

@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我的方面:[[email protected],[email protected]],這樣我就可以輕鬆地訪問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類,但上下文字段是私人的。可能嗎 ?我正在使用加載時間編織。

+0

你可以添加一個公共'的getContext()'方法來你的Hello類?否則,無論如何,在Java 7中,我會看[MethodHandle](http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html)。 –

+0

@ElliottFrisch nope我不能,這個想法是沒有針對澤西島應用程序的入侵式日誌記錄(不是我寫的) – Darek

+0

你在Java 7上嗎? –

回答

2

你將需要做的幾個步驟,假設你Object參考obj那麼你可以嘗試

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