2014-01-08 98 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应该是研究这个话题的极好资源。