Java - 无法获取自定义注释的值

标签 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(){

    }

}

父类(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/

相关文章:

php - Symfony 路由 - 语言环境作为子域,回退到默认

Java:如何在文件中搜索关键字?

java - 在Java中搜索二叉树的所有节点

java - 当我添加 <mvc :annotation-driven/>, 时,我得到 "Error creating bean"、 "java.lang.IllegalMonitorStateException"

复合键中的 Hibernate @GeneratedValue

java - 此位置不允许使用 Spring 注释 @Profile

java - 错误 : No suitable driver found for database on AWS RDS

java - 如何查找句子中二元语法的索引

java - 一个字段上的 Java 注解数量是否有限制?

java - 如何基于 URL 模式应用 Spring Boot 过滤器?