【问题标题】:How get the value of the parameter with annotation?如何通过注释获取参数的值?
【发布时间】:2018-03-31 06:46:50
【问题描述】:

我使用spring aop来拦截方法的调用。 然后我定义了一个注解TestParam

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface TestParam{}

我尝试将此注释添加到方法中的参数。

public class Test {
    public void test(String abc, @TestParam String def) {
    }
}

我尝试拦截调用

@Around
public Object intercept(ProceedingJoinPoint proceedingJoinPoint) {
    Signature signature = proceedingJoinPoint.getSignature();
    MethodSignature methodSignature = (MethodSignature)signature;
    Method method = methodSignature.getMethod();
    Parameter[] parameters = method.getParameters();
    for (Parameter parameter : parameters) {
        Annotation annotation = parameter.getAnnotation(TestParam.class);
        if (annotation != null) {
            // how can I can the value of this parameter
        }
    }
}

那如何获取@TestParam注解的参数的值呢?
我想获取参数的值,而不是注解的值。

【问题讨论】:

    标签: annotations spring-aop


    【解决方案1】:

    这是一个 MCVE,其中包含包名称、导入等。只需复制和粘贴即可。

    标记注释:

    package de.scrum_master.app;
    
    import static java.lang.annotation.ElementType.PARAMETER;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    @Target(PARAMETER)
    @Retention(RUNTIME)
    public @interface TestParam {}
    

    驱动程序应用:

    package de.scrum_master.app;
    
    public class Test {
      public void test(String abc, @TestParam String def) {}
      public void toast(@TestParam String def) {}
      public void doSomething(String abc, String def) {}
    
      public int doSomethingElse(@TestParam int number, String abc, @TestParam String def) {
        return number * 2;
      }
    
      public static void main(String[] args) {
        Test test = new Test();
        test.test("foo", "bar");
        test.toast("cheers");
        test.doSomething("foo", "bar");
        test.doSomethingElse(11, "bar", "zot");
      }
    }
    

    方面:

    package de.scrum_master.aspect;
    
    import java.lang.annotation.Annotation;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.reflect.MethodSignature;
    
    import de.scrum_master.app.TestParam;
    
    @Aspect
    public class MyAspect {
      @Around("execution(public * *(.., @de.scrum_master.app.TestParam (*), ..))")
      public Object doAwesomeStuff(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        System.out.println(thisJoinPoint);
        Object[] methodArgs = thisJoinPoint.getArgs();
        int numArgs = methodArgs.length;
        MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
        Annotation[][] annotationMatrix = methodSignature.getMethod().getParameterAnnotations();
        for (int i = 0; i < numArgs; i++) {
          Annotation[] annotations = annotationMatrix[i];
          for (Annotation annotation : annotations) {
            if (annotation.annotationType() == TestParam.class) {
              //System.out.println("  annotation = " + annotation);
              System.out.println("  annotated parameter value = " + methodArgs[i]);
            }
          }
        }
        return thisJoinPoint.proceed();
      }
    }
    

    控制台日志:

    execution(void de.scrum_master.app.Test.test(String, String))
      annotated parameter value = bar
    execution(void de.scrum_master.app.Test.toast(String))
      annotated parameter value = cheers
    execution(int de.scrum_master.app.Test.doSomethingElse(int, String, String))
      annotated parameter value = 11
      annotated parameter value = zot
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多