2014-01-08 97 views
0

我有以下方面。爲方法添加額外的參數?

@Around("somePublicMethod()") 
    public Object doAction(ProceedingJoinPoint call) throws Throwable { 
     SomeObject client = null; 
     Object result = null; 

     try 
     { 
      client = someDao.getResult(); 


      Object[] allArgs = call.getArgs(); 
      allArgs[allArgs.length-1] = client; 

      // Do the call, passing in the managed SiperianClientWrapper 
      result = call.proceed(allArgs); 
     } 
     catch(Exception ex) 
     { 

      throw ex; 
     } 

我有一個服務方法如下。該方法被上述方面攔截

public SomeEntity getEntities(String name, String pwd, SomeObject client){ 

//some logic 


} 

上述方法調用如下。

someService.getEntities("name","pwd",null); 

Some方面做的是SomeObject有null,null被一些實際值替換。

我的問題是不是將null作爲參數值,而是可以使用Reflection中的Aspect添加額外的參數?在我的情況下,可以動態添加SomeObject參數?

所以最後我不得不打電話給服務someService.getEntities("name","pwd");和SomeObject將動態添加Aspect?

謝謝!

回答

0

如果您的Java文件中聲明與方法聲明爲

public SomeEntity getEntities(String name, String pwd, SomeObject client){ 

那麼這是你必須使用什麼。方法調用如

someService.getEntities("name","pwd"); 

將不會編譯。

反射無法更改編譯的字節碼。

試圖通過反射調用此方法只有前兩個參數將導致IllegalArgumentException

+0

Sotirios,謝謝你的回答。我將更改getEntities方法簽名以接受兩個參數而不是三個參數。現在是否可以添加額外的一個方法參數或者是否有任何方法來注入SomeObject運行時? – user755806

+0

@ user755806編譯方法。在運行時你不能改變他們的簽名。如果你用可變參數聲明一個方法,你可以在運行時向它傳遞更多的參數。 –

0

如果您願意使用ajc編譯器,那麼可以使用extend class和重載方法,因爲javac編譯器不會編譯。 網上資源稀缺,但AspecJ in Action應該是研究這個話題的極好資源。