在实际应用中遇到了Java注解参数问题,在这里记录一下其原因。
定义
Annotation (注解) 表示的是能够添加到Java源代码的语法元数据。类、方法、变量、参数、包都可以被注解,可用来将信息元数据和程序元素进行关联。
参数类型
在JLS文档中明确规定了Java annotation 参数类型必须是下面列表之一,否则会抛编译错误:
- 所有基本数据类型(int,float,boolean,byte,double,char,long,short)
- String type
- Class type
- Enum type
- Annotation type
- 以及上面所有类型的数组
问题
实际应用中遇到如下两个疑问。
- 为什么不支持其他类型?
- 注解参数中为什么不支持对象方法?
#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 SSH项目 hibernate annotation
Java Annotation详解 Java Annotation详解 Java Annotation详解
Java 5 annotation 学习笔记Java 5 annotation 学习笔记Java 5 annotation 学习笔记
java之Annotation及其应用
Java annotation 什么是java annotation?annotation 的7种标注类型。nnotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、...
struts 拦截器,扩展,以及java annotation 这个是我学习所用,放在此处,作为中转。
JAVA注解(Annotation).doc JAVA注解(Annotation).doc
NULL 博文链接:https://lansky07.iteye.com/blog/289007
Java-Annotation使用大全 Java-Annotation使用大全 Java-Annotation使用大全
学习java自定义注解的小例子,处理运行时注解方法,可以结合博客学习,博客地址: http://blog.csdn.net/liuyonglei1314/article/details/59494503
java annotation手册 关于annotation是什么东西,百度一下会有很多关于它的描述,在这里就不用再copy了,我们还是以一个示例开始吧,在开始示例之前,我们先来一个小故事。
本文针对java初学者或者annotation初次使用者全面地说明了annotation的使用方法、定义方式、分类。初学者可以通过以上的说明制作简单的annotation程序,但是对于一些高级的annotation应用(例如使用自定义annotation...
个人收集的相关Java Annotation的资源资料内容。
java1.5 annotation注释源代码,
本文档主要讲述的是Java Annotation手册;Annotation提供了一条与程序元素关联任何信息或者任何元数据(metadata)的途径。从某些方面看,annotation就像修饰符一样被使用,并应用于包、类型、构造方法、方法、成员...
网上的Java并发编程源码一般都缺失一些Annotation,导致导入会报错。
JAVA Annotation学习示例 的一个简单示例 有源码 也有相关博客说明
Java 注解(Annotation) - 请认准 ih0qtq
java8 源码 Java注解 简介 由于无论在Java后台或者Android开发中我们经常遇到注解这个...通过@Target进行添加到注解中,说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Ann
Java Annotation注解技术