lombok原理

转载:https://www.lagou.com/lged

Javac原理

既然是在编译期对类进行操作了,那么就需要了解在Java中Javac到底对程序做了什么。Javac对代码编译的过程其实就是用Java来写的,可以查看其源码对其简单的分析。

编译过程大致分为了三个阶段

  • 解析与填充符号表
  • 注解处理
  • 分析与字节码生成

这三个阶段的交互过程如下图所示。

 

解析与填充符号表

这一步骤是两个步骤,包括了解析和填充符号,其中解析是分为词法分析语法分析两个步骤。

词法分析和语法分析

词法分析就是将源代码的字符流转变为Java中的标记(Token)集合,单个字符是程序编写过程中最小的元素,而标记(Token)则是编译过程中最小的元素,关键字、变量名、字面量、运算符都可以成为标记(Token)。比如在Java中int a = b+2,这段代码则表示了6个标记Token,分别是int、a、=、b、+、2。虽然关键字int是由三个字符构成的,但是它只是一个Token,不可以再拆分了。

语法分析是根据Token序列构造抽象对象树的过程,抽象语法树(Abstract syntax tree),是一种用来描述代码语法结构的树形表示方法,语法树的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、修饰符、运算符、接口、返回值甚至是代码注释都是一个语法结构。

语法分析分析出来的树结构是由JCTree来表示的,可以看一下它的子类有哪些。

自己建一个类,可以观察它在编译过程中用树结构表示是一种怎样的结构。

public class HelloJvm {

    private String a;
    private String b;

    public static void main(String[] args) {
        int c = 1+2;
        System.out.println(c);
        print();
    }

    private static void print(){

    }
}

可以看到这些都是JCTree的子类。可以知道编译期的树是以JCCompilationUnit为根节点,然后作为类的构成元素例如方法、私有变量、class类,这些都是作为树的构成一种。

 

注解处理器

第一步的解析和填充符号表完成以后,接下来就是我们的重头戏注解处理器了。因为在这一步就是Lombok实现原理的关键。

在JDK1.5之后,Java语言提供了对注解的支持,这些注解与普通的Java代码一样,是在运行期间发挥作用的。在JDK1.6中实现了对JSR-269的规范,提供了一组插入式注解处理器的标准API在编译期间对注解进行处理,我们可以把它看作是一组编译器的插件,在这些插件里面,可以读取,修改,添加抽象语法树中的任意元素。

如果这些插件在处理注解期间对语法树进行了修改,那么编译器将回到解析及填充符号表的过程重新处理,直到所有的插入式注解处理器都没有了再对语法树进行修改为止。每一次循环成为一个Round。

有了编译器注解处理的标准API后,我们的代码才有可能干涉编译器的行为,由于语法树中的任意元素,甚至包括代码注释都可以在插件之中访问到,所以通过插入式注解处理器实现的插件在功能上有很大的发挥空间。只要有足够多的创意,程序员可以使用插入式注解处理器来实现许多原本只能在编码中完成的事情。

 

语义分析与字节码生成

语法分析之后,编译器获得了程序代码的抽象语法树表示,语法树能表示一个结构正确的源程序的抽象,但是无法保证源程序是符合逻辑的。而语义分析的主要任务就是对结构上正确的源程序进行上下文有关性质的审查,如进行类型检查。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值