我有一个像这样的自定义注释 -
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ControllerAction {
String value();
}
我有一个使用此注释的类 -
public class TestController extends AbstractController {
public TestController () {
super();
}
@ControllerAction("add")
public void addCandidate(){
}
}
超级班看起来像这样 -
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的价值。不知怎的annotation.value()
在eclipse中给出了编译错误。 Eclipse没有显示任何可用于获取注释值的方法。
我想知道是否有办法获取Custom Annotation的value()。我不想用除String value()
以外的任何其他内容来定义我的注释。我想知道是否可以在我的自定义注释中使用String value()
实现我想要的效果?
非常感谢任何帮助。感谢。
答案 0 :(得分:3)
您可能需要更改
Annotation annotation = (ControllerAction) method.getAnnotation(ControllerAction.class);
要
ControllerAction annotation = method.getAnnotation(ControllerAction.class);
否则编译器将不知道特定于ControllerAction
的方法,因为annotation
的类型为Annotation
另外 - 正如Sharon Ben Asher所指出的 - 你应该使用AbstractController.class
来获取运行时实际实现的类,而不是getClass()
。鉴于当前代码,只会检查AbstractController
的方法,而不是实现类的方法。