我有以下代码
@UIUnitTimeout(8*60*1000) // works
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work
我知道根据 JLS,只允许常量表达式作为注释属性的值。但为什么?为什么数据类型匹配还不够?如果要在运行时评估表达式,是否有任何可能出错的地方?每个规范背后都有逻辑推理吗?
我有以下代码
@UIUnitTimeout(8*60*1000) // works
@UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work
我知道根据 JLS,只允许常量表达式作为注释属性的值。但为什么?为什么数据类型匹配还不够?如果要在运行时评估表达式,是否有任何可能出错的地方?每个规范背后都有逻辑推理吗?
注释就像类型扩展或关于类型的元数据。
因为 java 是一种静态类型语言(意味着在编译时知道类型),所以在编译时也知道注释属性数据(元数据)似乎是合理的——您正在定义/声明有关注释(扩展)的数据。
作为一个纯粹的实用点,对于注释处理,这是一个编译时(可选)步骤,属性数据必须在编译时知道 - 你还没有进入运行时环境,但你需要属性数据。
注释预处理需要在执行注释代码之前知道注释的值。此外,Annotation 定义本身使用@Retention 进行注释,其值为RetentionPolicy(如果未指定,则默认为 CLASS)。
因此有 3 种不同的“种类”注解,只有那些声明为 RUNTIME 的注解在程序执行时才可用。(但它们的值必须是常量,以便它们在不执行相关代码的情况下保持定义。)
CLASS 注释将由编译器记录在类文件中,但不需要在运行时由 VM 保留。
RUNTIME 注解将由编译器记录在类文件中,并在运行时由 VM 保留,因此可以反射性地读取它们。
SOURCE 注解将被编译器丢弃。
.