2017-03-21 79 views
0

我用java反射和AOP的有限知識來問這個問題。如何在aspectj建議類中獲取參數名稱?

背景:

我使用基於註解建議在我的Java 7應用程序。爲了得到我需要在我的建議中使用的方法參數,我使用了spring EL。見下面的例子: 在第一個例子中,我想使用第二個參數來做我的工作,而在第二個例子中,我使用了一個POJO並且想要使用它的「id」字段。

@MyAnnotation(param = "args[1]") 
public void someMethod(int param1, String param2) { 
    return null; 
} 

@MyAnnotation(param = "args[0].id") 
public void someMethod(SomeObject someObject) { 
    return null; 
} 

但是其實我想要的是,讓我的手在我的AOP的參數名稱。所以我可以用@MyAnnotation(param =「param1」)@MyAnnotation(param =「someObject.id」)來代替。

從我所知道的,你不能使用反射獲取參數名稱。但最近我碰到春天緩存抽象(link),在那裏我看到:

@Cacheable(cacheNames="books", key="#isbn") 
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed) 

有人可以放一些輕這裏,我怎麼能實現類似的行爲。

回答

0

請參閱MethodBasedEvaluationContextParameterNameDiscoverer

CacheEvaluationContextMethodBasedEvaluationContext的子類。

Code here ...

// Expose indexed variables as well as parameter names (if discoverable) 
    String[] paramNames = this.parameterNameDiscoverer.getParameterNames(this.method); 
    int paramCount = (paramNames != null ? paramNames.length : this.method.getParameterCount()); 
    int argsCount = this.arguments.length; 

    for (int i = 0; i < paramCount; i++) { 
     Object value = null; 
     if (argsCount > paramCount && i == paramCount - 1) { 
      // Expose remaining arguments as vararg array for last parameter 
      value = Arrays.copyOfRange(this.arguments, i, argsCount); 
     } 
     else if (argsCount > i) { 
      // Actual argument found - otherwise left as null 
      value = this.arguments[i]; 
     } 
     setVariable("a" + i, value); 
     setVariable("p" + i, value); 
     if (paramNames != null) { 
      setVariable(paramNames[i], value); 
     } 
    }