Java 除掉;注释属性的值必须是常量表达式";消息

Java 除掉;注释属性的值必须是常量表达式";消息,java,annotations,Java,Annotations,我在代码中使用注释,并尝试使用在运行时确定的值 我将我的列表定义为静态final(lst),并向该列表添加一些元素 当我使用lst.get(I)时,我得到编译错误: The value for annotation attribute must be a constant expression 这个问题的解决方案是什么?注释的值必须是编译时常量,因此没有简单的方法来完成您要做的事情 另见此处: 如果在运行程序之前已知值,则可以使用一些编译时工具(ant、maven?)对其进行配置。这就是Jav

我在代码中使用注释,并尝试使用在运行时确定的值

我将我的列表定义为
静态final
(lst),并向该列表添加一些元素

当我使用
lst.get(I)
时,我得到编译错误:

The value for annotation attribute must be a constant expression

这个问题的解决方案是什么?

注释的值必须是编译时常量,因此没有简单的方法来完成您要做的事情

另见此处:


如果在运行程序之前已知值,则可以使用一些编译时工具(ant、maven?)对其进行配置。

这就是Java中常量表达式的外观:

package com.mycompany.mypackage;

public class MyLinks {
  // constant expression
  public static final String GUESTBOOK_URL = "/guestbook";
}
您可以将其与注释一起使用,如下所示:

import com.mycompany.mypackage.MyLinks;

@WebServlet(urlPatterns = {MyLinks.GUESTBOOK_URL})
public class GuestbookServlet extends HttpServlet {
  // ...
}

使用常量表达式。这是无意义的限制;仅仅因为它是以这种方式实施的,并不意味着它是正确的方式。也许他们希望分阶段进行,首先实现编译时验证约束,但这并不意味着我们必须到此为止,对其缺乏灵活性进行嘲弄。我认为,现在是我们提出需要对约束进行运行时验证的时候了,即使这会对性能造成小的影响。那些具有编译时值的约束必须使用编译时验证器实现进行验证,而那些具有运行时值的约束必须使用运行时有效性进行验证。您可以用不同的方式安排事情:对无代码和重复进行向下投票。我不明白为什么这个问题被标记为重复。它们是相关的,但不是重复的。这个问题更具体。如果没有这个标题,我就不会认为其他问题的答案有帮助。>如果在运行程序之前已知值,可以使用一些编译时工具(ant、maven?)来配置它。怎么用?