1。前言Java源码中使用了Lombok的@Data注解:编译后的class文件在编译时自动添加一些方法来增强代码,如何增强,为什么?2、我们都知道@Data注解,@Retention(RetentionPolicy.SOURCE),编译器在编译时做的。这意味着注解的保留时间是在源代码期间,注解在编译后会被删除,在被删除之前,编译器会在其中添加一些方法和其他操作,即代码在编译过程中得到增强。3.原则3.1JDK6中提出并通过了JSR-269提案。该提案通过了一组称为“插件注释处理器”的标准API,可以在编译时提前在代码中实现特定的注释。处理,从而影响编译器的工作过程。3.2Java语言实现对于一些底层的实现,一般认为实现是像虚拟机一样使用C++实现的,对Java程序员来说不是特别友好。但是Javac编译器是用Java实现的,比较容易上手。3.3Javac的编译过程Javac的编译过程大致分为准备过程的几个步骤:插件注解处理器的初始化、符号表的分析和填充过程、词法和文法分析、抽象语法树的构建(AST),以及插件注解处理器的注解处理过程分析字节码生成过程的语法树发生变化后,会重新解析并填充符号表。当语法树不发生变化时,编译器将不再对源代码字符流进行操作,而是基于抽象语法树。综上所述,想要实现Lombok的效果,编译时只需要遵守JSR-269对AST进行操作即可。当然,不仅仅是Lombok实现了这个方法,比如FindBug、MapStruct等。3.4Lombok在编译过程中是如何做的。Lombok本质上是一个实现了“JSR269API”的程序。在使用javac的过程中,其功能的具体过程如下:javac分析源代码,生成抽象语法树(AST)。处理第一步得到的AST,找到@Data注解所在类对应的语法树(AST),然后修改语法树(AST),添加getter和setter方法定义的对应树节点.javac使用修改后的抽象语法树(AST)生成字节码文件,即在类中加入新的节点(代码块)3.5优缺点优点:可以自动生成constructors、getters/setters、equals、hashcode、toString等方法以注解的形式,提高了一定的开发效率,使得代码简洁,不用过多关注对应方法属性的修改,也简化了为这些生成的getter/setter方法的维护特性。缺点:不支持多参数构造器虽然上传省去了手动创建getter/setter方法的麻烦,但是大大降低了源码的可读性和完整性,降低了阅读源码的舒适度总结:像lombok这样的插件都是不再只是插件,它在编译器编译时通过操作AST(抽象语法树)来改变字节码的生成。变相的是在改变java的语法。它改变了您编写源代码的方式。它不像spring的依赖注入那样运行。不是编译时的功能,而是编译时的功能。如果一个项目有很多这样的插件,会大大降低阅读源码的舒适度。lombok只是省去了手动生成代码的麻烦,但是getter/setter这些方法也可以通过IDE的快捷键轻松生成。而且,有时通过在getter/setter中加入一点业务代码(但通常不推荐),可以大大简化某些业务场景的代码。
