百科问答小站 logo
百科问答小站 font logo



注解参数为什么不支持Object? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

感觉像是在设计Java语言层面的annotation功能时,受JVM当时直接支持的常量类型的限制而做的一个取舍。

我们可以看看JVM规范(Java SE 8版)的

4.7.16.1. The element_value structure

对annotation的element可以取的值在Class文件中的记录的规定。

首先,在Class文件里,所有原始类型、String、Class常量都是有特殊支持的,而对一般Object的“常量”则是不支持的,对enum常量也是不支持的。

Annotation的参数(element)也是一种编译时常量,必须能够被Class文件所支持的常量项所表述;所以它可以支持原始类型、String、Class常量是很直观的事,不需要对Class文件以及JVM动多少刀子。

但光支持这些类型对Java语言层面的新功能来说太憋屈了。好歹给支持个enum对不对?参数里还想放别的annotation值对不对?另外如果需要放一串同类型的值的话,还得支持数组对不对?

所以上面链接里提到的Class文件里的element_value结构就对这几种特殊的扩展情况做了特定的支持。仅此而已。这特定的支持的机制是无法泛化到支持一般的Object“常量”的。

===================================

今年刚开过的的JVM Language Summit 2016上,John Rose的VM Futures演讲还提到了希望未来能在Class文件里支持复杂对象类型的常量。等那个功能真的提上日程之后,题主这个疑问或许就能得到新的答案了——任意能合理的看作常量的对象类型都应该能作为annotation的参数值了。

演讲的录像:

youtube.com/watch?

(跟新常量类型相关的部分在31:30左右开始)




  

相关话题

  既然有文件后缀名,为何还需要MIME类型? 
  为什么微软.NET,C#在美国,英国等国外都非常流行,而在国内却逐渐没落? 
  如何评价《阿里巴巴JAVA开发手册》完美版,终极版,纪念版? 
  Gradle 比 Maven 好为什么用的人少? 
  对于多核CPU java中Thread.currentThread() 指的是哪个核上的线程? 
  为什么 Java/JDK 都快出 18 了,还有人用 1.8 呢? 
  JavaScript(V8,Node) 的开发效率比 Java(JVM,Vert.x) 高在哪里? 
  面向对象编程中, 接口既然不能直接描述方法, 要他有何用? 
  关于后端程序员写前端用什么框架更好? 
  很多人都说 C# 语法怎么优雅,仅仅是因为 C# 的关键字多吗? 

前一个讨论
游戏中的动态模糊是什么概念?
下一个讨论
民众是否需要知道所有的真相?





© 2024-05-17 - tinynew.org. All Rights Reserved.
© 2024-05-17 - tinynew.org. 保留所有权利