Annotation的介绍
一种对源代码进行说明的元数据。应用于包、接口、类、字段、构造器、方法参数、局部变量的特殊修饰符,用来描述元数据的一种工具,主要作用:
1、生成文档:通过代码中标识的元数据生成javadoc文档
2、编译检查:通过代码中标识的元数据让编译器在编译期间进行检查验证
3、编译时动态处理:编译时通过代码中标识的元数据动态处理,如动态生成代码
4、运行时动态处理:编译时通过代码中标识的元数据动态处理,如反射注入实例
注解主要分为三类:
1、Java 自带的标准注解
包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
2、元注解
定义注解的注解。四种元注解主要包括
1、@Retention:标识注解被保留的阶段(生命周期)
RetentionPolicy.SOURCE — 只在源码显示、在编译阶段丢弃。这些注解在编译结束之后就不再有任何意义,所以它们不会写入字节码。@Override, @SuppressWarnings都属于这类注解。
RetentionPolicy.CLASS — 在类加载的时候丢弃。在字节码文件的处理中有用。注解默认使用这种方式。
RetentionPolicy.RUNTIME — 始终不会丢弃,运行期也保留该注解,因此可以使用反射机制读取该注解的信息。我们自定义的注解通常使用这种方式。
2、@Target:标识注解的使用范围(作用域)
ElementType.TYPE:用于描述类、接口或enum声明
ElementType.FIELD:用于描述实例变量
ElementType.METHOD:方法声明
ElementType.PARAMETER:参数声明
ElementType.CONSTRUCTOR:构造方法声明
ElementType.LOCAL_VARIABLE:局部变量声明
ElementType.ANNOTATION_TYPE:
ElementType.PACKAGE:用于记录java文件的package信息
3、@Inherited:标识注解可继承
4、Documened:标识注解是否生成javadoc文档
3、自定义注解
根据自己的需求定义注解,并可用注解对自定义注解进行注解。
使用注解:
@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,...)
解析注解:
通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。
注解的原理
从java源码到class字节码是由编译器完成的,编译器会对java源码进行解析并生成class文件,而注解也是在编译时由编译器进行处理,编译器会对注解符号处理并附加到class结构中。根据jvm规范,class文件结构是严格有序的格式,唯一可以附加信息到class结构中的方式就是保存到class结构的attributes属性中。我们知道对于类、字段、方法,在class结构中都有自己特定的表结构,而且各自都有自己的属性,而对于注解,作用的范围也可以不同,可以作用在类上,也可以作用在字段或方法上,这时编译器会对应将注解信息存放到类、字段、方法自己的属性上。
网友评论