访问注释构造的修改参数

时间:2015-02-19 02:19:29

标签: java spring reflection annotations spring-annotations

我对注释究竟是如何工作有点困惑所以我无法轻易找到答案,即使它没有解释就在我眼前。

让我们说例如我们有这个类

//this happens to be a Spring annotation in this case
@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = " not found")
class NotFoundException extends RuntimeException {

    public NotFoundException(String resourceName) {
        //get access to reason from class's annotation
        reason = resourceName + reason;
    }
}

如何在运行时访问注释的参数reason?这甚至可能吗?如果是这样,我知道有反思,但不完全确定正确的方法。

2 个答案:

答案 0 :(得分:2)

immibis向您展示了从注释中检索属性的技术方法。

但我认为没有理由这样做。首先,作为ResponseStatus#reason状态的javadoc

  

如果未设置此元素,则默认为标准状态   消息为状态代码。请注意,由于使用   HttpServletResponse.sendError(int, String),回复将是   被认为是完整的,不应再写入任何内容。

您可能希望将标准状态消息写入响应而不是您自己的消息。

如果您仍然想要自己的,我会定义一个常量表达式,并在需要reason时引用它,而不是从注释中检索它。

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = NotFoundException.REASON)
class NotFoundException extends RuntimeException {
    static final String REASON = " not found"; // you can define this in another class

    public NotFoundException(String resourceName) {
        String something = resourceName + REASON;
    }
}

答案 1 :(得分:1)

您可以阅读注释reason

String reason = NotFoundException.class.getAnnotation(ResponseStatus.class).reason();

您无法更改注释中的值。