java - 如何使用 Spring AOP(AspectJ 风格)访问方法属性?

标签 java aop aspectj spring-aop

我需要通过使用注释作为切入点来截取一些方法及其属性,但我该如何访问这些方法属性。我有以下代码可以在方法运行之前成功运行代码,但我只是不知道如何访问这些属性。

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();
 }
}

最佳答案

您可以从 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();
}

关于java - 如何使用 Spring AOP(AspectJ 风格)访问方法属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4030833/

相关文章:

java - 在同一个项目中同时进行 Java 和 Scala 开发

java - 简单线程串联运行? (第二个线程在第一个线程停止之前不会运行)

c# - PostSharp 冲突方面警告

java - LOG4j Spring AOP

java - 带注释字段的 Spring AOP 切入点表达式

java - JNLP/Webstart - 设置环境变量

java - 用于调节和字符串匹配

hibernate - 实体bean的Guice依赖注入(inject)?

java - 使用 Spring 和 AspectJ 在类上定位基于注释的方面

java - Spring REST服务,注册用户,身份验证