如何在aspectj建议类中获取参数名称?

时间:2017-03-21 18:31:17

标签: reflection annotations aop spring-el

我用java反射和AOP的有限知识问这个问题。

背景

我在Java 7应用程序中使用基于注释的建议。为了获得我需要在我的建议中使用的方法参数,我使用的是弹簧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")代替。

据我所知,您无法使用反射获取参数名称。但最近我遇到了Spring缓存抽象(link),我看到了:

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

有人可以在这里说清楚,我怎么能达到类似的行为。

1 个答案:

答案 0 :(得分:0)

请参阅ParameterNameDiscovererCacheEvaluationContext

MethodBasedEvaluationContext // 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); } } 的子类。

Code here ...

{{1}}