在春天,它用这样的方式来表达艺术名称:
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && @annotation(auditable)",
argNames="bean,auditable")
public void audit(JoinPoint jp, Object bean, Auditable auditable) {
AuditCode code = auditable.value();
// ... use code, bean, and jp
}在doc中,它表示您可以从"argNames“属性的值中省略参数的名称。spring如何从argNames("bean,auditable")获得anyPublicMethod?
java提供了一些api来获取参数名吗?
我认为它使用aspectJ来解析表达式,aspectJ提供了这个特性吗?
发布于 2014-07-29 03:15:10
在Java8中,我们可以使用反射获取参数名称,参见http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html。但是,如果类是用-g:vars编译的,则会出现参数名称。
在早期的版本中,我们需要使用一些工具,比如Javassist:
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass c = pool.get("test.Test");
CtMethod m = c.getDeclaredMethod("main");
MethodInfo methodInfo = m.getMethodInfo();
LocalVariableAttribute t = (LocalVariableAttribute) methodInfo.getCodeAttribute().getAttribute(javassist.bytecode.LocalVariableAttribute.tag);
int i = t.nameIndex(0);
String v = methodInfo.getConstPool().getUtf8Info(i);
System.out.println(v);
}版画
args发布于 2014-07-29 03:05:17
你的注释
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && @annotation(auditable)",
argNames="bean,auditable"),假设anyPublicMethod()匹配任何公共方法,将匹配任何带有注释的任何公共方法,无论参数名为auditable并在绑定到名为bean的参数的对象上调用。
在您的方法中,名为auditable的参数类型为Auditable,因此这个@Before建议将匹配以下内容
public class SomeComponent {
@Auditable
public void someMethod() {}
}在调用通知时,我将将SomeComponent类型bean绑定到bean参数,并将@Auditable注释的实例绑定到auditable参数。
Java没有获取参数名称的API。参数名也不总是出现在字节码中。当它们出现时,Spring使用ASM库来解析字节码并检索它们。
发布于 2014-07-29 06:38:40
只是对其他答案的补充。Spring文档是显式的: Spring尽力检索正确的参数:
ajc (aspectJ编译器),则相同。@Param注释。https://stackoverflow.com/questions/25007286
复制相似问题