我有一个像这样的自定义注释 -
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ControllerAction {
String value();
}
我有一个像这样使用此注释的类 -
public class TestController extends AbstractController {
public TestController () {
super();
}
@ControllerAction("add")
public void addCandidate(){
}
}
父类(super class)看起来像这样 -
public abstract class AbstractController {
public AbstractController (){
}
public CustomBean processRequest(ServletAction action, HttpServletRequest request) {
Class<AbstractController > controllerClass = AbstractController.class;
for (Method method : controllerClass.getDeclaredMethods()) {
if (method.isAnnotationPresent(ControllerAction.class)) {
Annotation annotation = (ControllerAction) method.getAnnotation(ControllerAction.class);
if(annotation != null){
if(annotation.value().equals(action.getAction())){
method.invoke(controllerClass.newInstance());
}
}
}
}
return null;
}
}
processRequest(...)
AbstractController
中的方法直接从 servlet 调用。 processRequest() 方法确定 servlet 操作,并基于此,它应该适本地调用该方法。
例如,如果 ServletAction.getAction() == 'add'
, processRequest()
应该自动调用addCandidate()
在TestController
。但我无法获得注释的值。不知何故annotation.value()
在 eclipse 中给出编译错误。 Eclipse 没有显示任何我可以用来获取注释值的方法。
我想知道是否有办法获取自定义注释的 value() 。我不想用 String value()
以外的任何东西来定义我的注释。 。我想知道仅 String value()
是否可以实现我想要的目标在我的自定义注释中?
非常感谢任何帮助。谢谢。
最佳答案
你可能需要改变
Annotation annotation = (ControllerAction) method.getAnnotation(ControllerAction.class);
至
ControllerAction annotation = method.getAnnotation(ControllerAction.class);
否则,编译器将无法识别 ControllerAction
特有的方法,因为 annotation
的类型为 Annotation
此外 - 正如 Sharon Ben Asher 所指出的 - 您应该使用 getClass()
来获取运行时实际实现的类,而不是 AbstractController.class
。给定当前代码,仅检查 AbstractController
的方法,而不检查实现类的方法。
关于Java - 无法获取自定义注释的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49637959/