信步漫谈之模拟lombok实现Getter注释
1 目标
- 模拟 lombok 实现 Getter 注释
2 资源
lombok 官网:https://projectlombok.org/
lombok github地址:https://github.com/projectlombok/lombok
3 关联知识
java 注释分类
- Java中的注解分为运行时注解和编译时注解
- 编译期:Java语言的编译期是一段不确定的操作过程,因为它可能是将.java文件转化成.class文件的过程;也可能是指将字节码转变成机器码的过程;还可能是直接将*.java编译成本地机器代码的过程
- 运行期:从JVM加载字节码文件到内存中,到最后使用完毕以后卸载的过程都属于运行期的范畴。
- 注解处理工具apt(Annotation Processing Tool),这是Sun为了帮助注解的处理过程而提供的工具,apt被设计为操作Java源文件,而不是编译后的类。它是javac的一个工具,中文意思为编译时注解处理器。APT可以用来在编译时扫描和处理注解。通过APT可以获取到注解和被注解对象的相关信息,在拿到这些信息后我们可以根据需求来自动的生成一些代码,省去了手动编写。注意,获取注解及生成代码都是在代码编译时候完成的,相比反射在运行时处理注解大大提高了程序性能。APT的核心是AbstractProcessor类。
使用到的注释说明
- SupportedAnnotationTypes:表示该处理器要处理的注解
- SupportedSourceVersion:表示所支持的Java版本
- Retention:是jdk的一个元注解,用来指示其它注解类型保留的生命周期。注解上面有一个属性value,它是RetentionPolicy类型的枚举类,RetentionPolicy枚举类中有三个值。
- SOURCE 修饰的注解:修饰的注解,表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中
- CLASS 修饰的注解:表示注解的信息被保留在class文件(字节码文件)中当程序编译时,但不会被虚拟机读取在运行的时候
- RUNTIME 修饰的注解:表示注解的信息被保留在class文件(字节码文件)中当程序编译时,会被虚拟机保留在运行时。所以它能够通过反射调用,所以正常运行时注解都是使用的这个参数
- Target:是jdk的一个元注解,用来说明所修饰的对象范围。注解上面也有个属性value,它是ElementType类型的枚举。是用来修饰此注解作用在哪的。
- TYPE:用于描述类、接口(包括注解类型) 或枚举声明
- FIELD:用于描述域
- METHOD:用于描述方法
- PARAMETER:用于描述参数
- CONSTRUCTOR:用于描述构造器
- LOCAL_VARIABLE:用于描述局部变量
- ANNOTATION_TYPE:用于描述声明
- PACKAGE:用于描述包
- TYPE_PARAMETER:用来标注类型参数,需要jdk1.8或以上
- TYPE_USE:能标注任何类型名称,需要jdk1.8或以上
4 模拟 lombok 实现 Getter 注释程序
见 https://gitee.com/alfredinchange/java-developer.git 下 com.alfred.java.sllombok
5 程序使用方法
- 执行 compile.bat 脚本进行编译和执行,会自动创建 classes 文件夹
- 查看编译执行后 Main 的输出
- 注意:代码 Main 中报错是正常的,因为还未通过编译创建 getUserName 方法
6 编译指令介绍
- javac 是 Java 编译器,用于将 Java 源代码(.java 文件)编译成 Java 字节码(.class 文件)
- 基本格式:javac [options] sourcefiles
- 加上 -cp 或 -classpath 选项用于指定在编译过程中需要搜索的类或包的位置。这通常是包含第三方库和其他依赖项的目录或 JAR 文件的路径
javac -cp /path/to/classes:/another/path/to/libraries/*.jar MyClass.java
- java 命令用于运行 Java 程序。它启动 Java 虚拟机(JVM),并加载指定的类作为应用程序的入口点
- 基本格式:java [options] class [args...]
- 使用 -cp 或 -classpath 选项用于指定在运行时需要搜索的类或包的位置
java -cp /path/to/classes:/another/path/to/libraries/*.jar MyClass
- javap 是 Java 反汇编器,用于将 .class 文件中的字节码反汇编成更可读的格式
- 基本格式:javap [options] classfiles
- 使用 -p(注意,javap 不直接支持 -cp 或 -classpath):javap 本身不直接需要 -cp 或 -classpath(因为它通常只处理已编译的 .class 文件)