Java - 无法获得Custom Annotation的值

时间:2018-04-03 19:41:08

标签: java annotations

我有一个像这样的自定义注释 -

@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()实现我想要的效果?

非常感谢任何帮助。感谢。

1 个答案:

答案 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的方法,而不是实现类的方法。