有一种处理注释的方法,例如
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
吗?如何处理并将注释值传递给该函数!
答案 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的困扰。您不是在描述要解决的实际问题,而是描述解决方案的样子,使自己和其他人不知所措,以寻求解决问题的更好方法。因此,我的示例代码可能并不能真正解决您的问题,而只是使您的难看解决方案以某种方式起作用。这与好的设计不同。