我用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)
有人可以在这里说清楚,我怎么能达到类似的行为。
答案 0 :(得分:0)
请参阅ParameterNameDiscoverer
和CacheEvaluationContext
。
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}}