java 如何使用 Spring AOP(AspectJ 风格)访问方法属性?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4030833/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I access methods attributes with Spring AOP (AspectJ-style)?
提问by newbie
I need to intrecept some methods and their attributes by using annotations as point cuts, but how can I access those method attributes. I have following code that succesfully can run code before method is run, but I just don't know how I can access those attrbiutes.
我需要通过使用注释作为切入点来拦截一些方法及其属性,但是我如何访问这些方法属性。我有以下代码可以在运行方法之前成功运行代码,但我只是不知道如何访问这些属性。
package my.package;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut(value="execution(public * *(..))")
public void anyPublicMethod() {
}
@Around("anyPublicMethod() && @annotation(myAnnotation )")
public Object myAspect(ProceedingJoinPoint pjp, MyAnnotation myAnnotation)
throws Throwable {
// how can I access method attributes here ?
System.out.println("hello aspect!");
return pjp.proceed();
}
}
回答by Sean Patrick Floyd
You can get them from the ProceedingJoinPoint
object:
您可以从ProceedingJoinPoint
对象中获取它们:
@Around("anyPublicMethod() && @annotation(myAnnotation )")
public Object myAspect(final ProceedingJoinPoint pjp,
final MyAnnotation myAnnotation) throws Throwable{
// retrieve the methods parameter types (static):
final Signature signature = pjp.getStaticPart().getSignature();
if(signature instanceof MethodSignature){
final MethodSignature ms = (MethodSignature) signature;
final Class<?>[] parameterTypes = ms.getParameterTypes();
for(final Class<?> pt : parameterTypes){
System.out.println("Parameter type:" + pt);
}
}
// retrieve the runtime method arguments (dynamic)
for(final Object argument : pjp.getArgs()){
System.out.println("Parameter value:" + argument);
}
return pjp.proceed();
}
回答by Bozho
ProceedingJoinPoint
has pjp.getArgs()
, which returns all the parameters of the method.
ProceedingJoinPoint
has pjp.getArgs()
,它返回该方法的所有参数。
(but these are called parameters / arguments, not attributes)
(但这些被称为参数/参数,而不是属性)