[随笔] lombok源码有感

最近感觉脑子就是个频繁断电的内存 装进去的东西总是忘 感觉随便写点 方便整理笔记的时候好看。

最近研究jvm的javac过程,想写一个方便正则的插件,便思考到lombok的原理。
在书里叫“插入式注解处理器” 但其实它可操作的不只是注解 操作普通代码(除了代码块的其他“定义类型代码”,如定义方法,定义域,定义引用包,定义类这样的,代码块在ast上就一个节点,目前我也不知道怎么操作这个节点)也是可以的。总之就是操作代码改变其ast 从而影响生成class文件

lombok有几点我比较喜欢。
一个是有一个CleanUpRegisty,注册了需要清理的类。
1.javac是单线程,lombok可能是先行处理class文件(这点有待推敲,怎么判断是lombok先行还是javac先行),lombok结束之后清理掉不用的类节省下内存空间。
2.lombok分为两块一种是javac编译器 一种是eclipse的编译器 但是怎么判断编译器类型我没细看 我只看了javac的编译器插件的实现。
3.lombok用了spi,
一个是lombok代码内部用了spi,读一些如HandlerData之类的JavacAnnotationHander的子类,他没有像网上那些Ser...什么的类来生成实例,而是用了反射new一个实例。
另一个是对jdk内部的javac的javax包内Processor实行了spi,这一点我还不知道具体流程,感觉很神奇,难道是javac这个项目内部就有spi读取?

下面是最重要的
4.HandlerLibrary中的loadAnnotationHandlers中的findServices方法实现有点巧妙,此方法返回一个iterable,这个iterable还和方法内部的变量有联系(注意lambda表达式可以使用局部变量,但是必须是final类型的或事实上final类型)。

我也写这个插件要注意:
1.能不能跟lombok共同运行

猜你喜欢

转载自www.cnblogs.com/chris633/p/11991657.html