如何将注释类型作为方法参数传递?

时间:2019-04-01 07:27:57

标签: java annotations spring-aop aspect

有一种处理注释的方法,例如

public void getAnnotationValue(ProceedingJoinPoint joinPoint)
{
     MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
     Method method = methodSignature.getMethod();
     Annotation annotation = method.getParameterAnnotations()[0][0];
    RequestHeader requestParam = (RequestHeader) annotation;
    System.out.println(requestParam.value());
}

我想将其转换为可以接受joinPoint和Annotation Type之类的通用方法

getAnnotationValue(joinPoint, RequestHeader);

我尝试使用的方法:

public void getAnnotationValue(ProceedingJoinPoint joinPoint, Class<? extends Annotation> annotationType)
    {
         MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
         Method method = methodSignature.getMethod();
         Annotation annotation = method.getParameterAnnotations()[0][0];
        annotationType requestParam = (annotationType) annotation;
        System.out.println(requestParam.value());
    }

但是它提示错误提示type unresolved error吗?如何处理并将注释值传递给该函数!

2 个答案:

答案 0 :(得分:0)

您可以做的“最好的”事情:

public void foo(Class<? extends java.lang.annotation.Annotation> annotationClass) { ...

对于注释没有特定的“类型”类,但是您只能使用普通的Class对象,而只是表示您期望Annotation基类的子类。

答案 1 :(得分:0)

您要执行的操作无法正常工作。问题不在于方法签名,而是您对如何在Java中使用类型的错误理解。在这一行...

annotationType requestParam = (annotationType) annotation;

...您有两个错误:

  • 您无法使用annotationType requestParam声明变量,因为annotationType不是类名文字,而是变量名。这是一个语法错误,编译器将其标记为错误。
  • 出于与第一种情况相同的原因,您不能使用(annotationType) annotation进行投射。 Java不能那样工作,代码只是无效。

在前面的代码中,假设捕获的注释类具有方法value(),这对于某些注释类可能是正确的,但在一般情况下不起作用。但是,假设在调用辅助方法的所有情况下确实存在该方法,则可以将其更改为如下所示:

public void getAnnotationValue(JoinPoint joinPoint) {
  MethodSignature methodSignature = (MethodSignature) joinPoint.getStaticPart().getSignature();
  Method method = methodSignature.getMethod();
  Annotation annotation = method.getParameterAnnotations()[0][0];
  Class<? extends Annotation> annotationType = annotation.annotationType();
  try {
    System.out.println(annotationType.getMethod("value").invoke(annotation));
  } catch (Exception e) {
    throw new SoftException(e);
  }
}

海事组织这很丑陋,也不是很好的编程方法。但是它可以编译并运行。顺便说一句,如果注释类型没有value()方法,您将看到抛出NoSuchMethodException

我认为您在这里受XY problem的困扰。您不是在描述要解决的实际问题,而是描述解决方案的样子,使自己和其他人不知所措,以寻求解决问题的更好方法。因此,我的示例代码可能并不能真正解决您的问题,而只是使您的难看解决方案以某种方式起作用。这与好的设计不同。