Java parameter types of annotation introduce

阅读更多

在实际应用中遇到了Java注解参数问题,在这里记录一下其原因。

定义

Annotation (注解) 表示的是能够添加到Java源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据和程序元素进行关联。

参数类型

在JLS文档中明确规定了Java annotation 参数类型必须是下面列表之一,否则会抛编译错误:

  • 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
  • String type
  • Class type
  • Enum type
  • Annotation type
  • 以及上面所有类型的数组
问题

实际应用中遇到如下两个疑问。

  1. 为什么不支持其他类型?
  2. 注解参数中为什么不支持对象方法?

#1

在Java中,annotation只能用编织器常量,String也是特殊处理的常量,所以它是所支持的类型。对于变量,就要涉及初始化,序列化等问题,不知出于什么原因目前在Java注解中是不支持的,也许是一种取舍的选择。

为了更清晰的了解器原因,查看JVM规范(Java SE 8版)的4.7.16.1. The element_value structure对annotation的element可以取值的相关规定。

首先,在Class文件里,所有原始类型、String、Class常量都是有特殊支持的,对于一般Object对象,接口和enum常量是不支持的,详细解析如下:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.16.1-130 

根据JLS规范我们了解到Annotation的参数也是一种编译时常量,且必须能够被Class文件所支持,说明Java 不想为了一个Annotation对Class文件和JVM做太大改动。

然而在实际应用中我们会发现这样使得annnotation的能力大大折扣,如果可以支持interface或enum将对注解的应用性有大大提升,期待java后期版本中可以改善。

 

#2

Annotation参数不仅仅不能是Object,同时由于它的参数必须是一种编译时常量,所以例如下面的写法是不合法的

 

@MyAnnotatiion(value="name"+myobject.doSomeThing())
 相关详细信息请参照 https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.1

你可能感兴趣的:(Java,JVM,JLS)