Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么注释属性的值应该是常量表达式?_Java_Annotations - Fatal编程技术网

Java 为什么注释属性的值应该是常量表达式?

Java 为什么注释属性的值应该是常量表达式?,java,annotations,Java,Annotations,我有下面的代码 @UIUnitTimeout(8*60*1000) // works @UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work 我知道根据JLS,只允许常量表达式作为注释属性的值。但是为什么呢?为什么数据类型匹配是不够的?如果在运行时对表达式求值,是否有可能出错?每个规范背后都有逻辑推理吗?注释类似于类型扩展或关于类型的元数据 因为java是一种静态类型语言(意味着类型在编译时已知),所以在编译时也知道注释属

我有下面的代码

 @UIUnitTimeout(8*60*1000) // works
 @UIUnitTimeout(TimeUnit.MINUTES.toMillis(8)) // does not work

我知道根据JLS,只允许常量表达式作为注释属性的值。但是为什么呢?为什么数据类型匹配是不够的?如果在运行时对表达式求值,是否有可能出错?每个规范背后都有逻辑推理吗?

注释类似于类型扩展或关于类型的元数据

因为java是一种静态类型语言(意味着类型在编译时已知),所以在编译时也知道注释属性数据(元数据)似乎是合理的——您正在定义/声明有关注释(扩展)的数据


作为一个纯粹的实用点,例如,作为编译时(可选)步骤,属性数据必须在编译时已知-您尚未到达运行时环境,但需要属性数据。

注释预处理要求在执行注释代码之前知道注释的值。此外,注释定义本身是用@Retention表示的,其值为(如果未指定,则默认为CLASS)

因此,有3种不同的“类型”注释,只有那些声明为运行时的注释在程序执行时才可用。(但它们的值必须是常量,以便它们在不执行关联代码的情况下保持定义状态。)

类注释将由编译器记录在类文件中 但不需要在运行时由VM保留

运行时注释将由编译器记录在类文件中,并由 虚拟机在运行时运行,因此可以反射地读取它们

编译器将丢弃源注释


.

注释不应该是编译时常量吗?@baraky OP似乎已经知道了这一点。因为注释是编译时构造。抱歉,波希米亚人,我没有看到你关于注释处理的帖子。