注解
运行
Sun JDK字节码生成分为三个阶段:
- 解析和填充符号表过程,生成语法树
- 插入式注解处理器的注解处理过程,可以操作语法树。
- 这个操作语法树的特性,可以让注解生成代码或者填充默认值
- Google的AutoValue值类型生成类库
- 分析与字节码生成。
作用阶段:
枚举类型 java.lang.annotation.RetentionPolicy
- SOURCE表示这个Annotation类型的信息只会保留在源码里,源码经过编译之后,Annotation的数据就会消失,并不会保留在编译好的. class文件里;
- CLASS表示这个Annotation类型的信息在源码保留,在.class文件也保留,但不会把这些信息加载到虚拟机(JVM)中,如果不设置, 系统默认值是CLASS;
- RUNTIME表示在源码,编译后的.class都保存信息,在执行的时候也会把这些信息加载到JVM中
作用范围
枚举类型 java.lang.annotation.ElementType
- TYPE(类型)可以用在class, interface ,eumn,annotation上面
- FILED(字段)
- METHOD(方法)
- PARAMETER(参数)
- CONSTRUCTOR(构造器)
- LOCAL_VARIABLE(局部变量)
- ANNITATION_TYPE(注解)
- PACKAGE(包)其中TYPE是指,如果没有制定, 那么它可以用在任何上面
我们写一个最简单的注解,可以为类和字段上使用,作用于运行期间
测试类
我们可以通过反射获取类、方法、字段上的注解,根据注解的类型,我们可以获取注解的值,进而,把值赋值给操作对象。
结果是熟悉的儿歌O(∩_∩)O哈哈~
注解处理器
注解处理器在编译期发生作用,被注解处理器支持的注解标记的类、字段、方法,可以被注解处理器改变语法树,生成新的类或者字节码。这里用注解处理器处理java Bean生成模板。
自定义javaSe.special.annotation.processor.AutoValue.java
Java Bean
注解处理器
比较重要的几个要重写的方法,可以用注解赋值如下,或者重写父类对应的方法。
必须要重写的方法:
需要支持的java源码版本
一个或多个支持的注解类型
处理程序。
编译及结果
javac
//指定自定义注解相关字节码classpath
-cp E:work4javaMyJavaDesignsrc
//指定自定义注解处理器
-processor javaSe.special.annotation.processor.AutoValueProcessor
//指定自定义注解处理器根路径
-processorpath E:work4javaMyJavaDesignsrc
//要编译的一个或多个类
E:work4javaMyJavaDesignsrcjavaSespecialannotationprocessorStudent.java E:work4javaMyJavaDesignsrcjavaSespecialannotationprocessorTeacher.java
结果运行图: