在写Java代码的时候,最烦写setter/getter方法,自从有了Lombok插件不用再写那些方法之后,感觉再也回不去了,那你们是否好奇过Lombok是怎么把setter/getter方法给你加上去的呢?有的同学说我们Java引入Lombok之后会污染依赖包,那我们可不可以自己写一个工具来代替Lombok呢?
知识点- Java编译过程
- 了解Lombok原理
- 了解插入式注解处理器
序言提到的问题其实都是同一个问题,就是如何去获取和修改Java源代码?
要回答这个问题,我们需要回答这几个问题:
- Java编译器是如何解析Java源代码的?
- 编译器编译源代码都有哪些步骤?
- 我们在编译器工作的时候,怎么才能去增加内容或者是进行代码分析?
希望大家看完本文能够自己写一个简易的Lombok工具。
回答 如何解析源代码其实从我们的代码到被编译,中间隔了一个数据结构,叫做AST(抽象树)。具体的形式,可以查看下面的图片。右边的便是AST的数据结构了。
整个编译过程大致如下:
图片来自 openjdk
1、初始化插入注解处理器
2、解析与填充符号表过程
a.词法分析、语法分析。将源代码的字符流转变为标记集合,构造出抽象语法树。
b.填充符号表。产生符号地址和符号信息。
3、插入式注解处理器的注解处理过程:插入式注解处理器的执行阶段。后面我会给大家带来两个此方面的实用实战例子。
4、分析与字节码生成过程
a.标注检查。对语法的静态信息检查。
b.数据流及控制流分析。对程序动态运行过程进行检查。
c.解语法糖。将简化代码编写的语法糖还原为原有的形式。
d.字节码生成。将前面各个步骤所生成的信息转化成为字节码。
我们知道了上面的理论之后,接下来我们进行实战。带着大家一起去修改AST(抽象树)。添加自己的代码。
实战 如何自己实现一个自动添加Setter/Getter的工具首先,我们创建一个自己的注解。
@Retention(RetentionPolicy.SOURCE) // 注解只在源码中保留
@Target(ElementType.TYPE) // 用于修饰类
public @interface MySetterGetter {
}
创建一个需要生成setter/getter方法的实体类
@MySetterGetter // 打上我们的注解
public class Test {
private String wzj;
}
接下来就来看一看如何来生成我们想要的字符串。
整体代码如下:
@SupportedAnnotationTypes("com.study.practice.nameChecker.MySetterGetter")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class MySetterGetterProcessor extends AbstractProcessor {
// 主要是输出信息
private Messager messager;
private JavacTrees javacTrees;
private TreeMaker treeMaker;
private Names names;
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
this.messager = processingEnv.getMessager();
this.javacTrees = JavacTrees.instance(processingEnv);
Context context = ((JavacProcessingEnvironment)processingEnv).getContext();
this.treeMaker = TreeMaker.instance(context);
this.names = Names.instance(context);
}
@Override
public boolean process(Set
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?