信步漫谈之模拟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 文件)

7 参考资料(感谢)

Lombok经常用,但是你知道它的原理是什么吗?

Lombok框架集成及原理解析

Lombok 原理分析与功能实现

posted @ 2024-11-13 19:21  临渊启明  阅读(1)  评论(0编辑  收藏  举报