自定义Lombok注解

本文详细介绍了如何创建自定义Lombok注解,如@KLog,通过实现Javac、Eclipse和IntelliJ IDEA的Handler进行代码注入。Lombok通过修改AST并在编译时生成字节码,实现减少样板代码的功能。文章涵盖了从创建注解、实现编译器处理器到添加IDE支持的全过程。
摘要由CSDN通过智能技术生成

Java 是一门"繁琐"的语言,使用 Lombok 可以显著地减少样板代码。比如使用 @Getter 注解可以为你的私有属性创建 get 方法。

源代码
@Getter private int age = 10;
生成后代码
private int age = 10;
public int getAge() {
  return age;
}

Lombok 自身已经拥有许多非常实用的注解,例如 @Getter / @Value / @Data / @Builder 等等。但你可能也想定义自己的注解来减少重复代码,本文将讲解如何实现这一目标。

Lombok是如何实现代码注入的?

在使用 javac 编译器时(netbeans,maven,gradle),Lombok 会以 annotation processor 方式运行。 Javac 会以 SPI 方式加载所有 jar 包中 META-INF/services/javax.annotation.processing.Processor 文件所列举的类,并以 annotation processor 的方式运行它。对于 Lombok,这个类是 lombok.launch.AnnotationProcessorHider$AnnotationProcessor ,当它被 javac 加载创建后,会执行 init方法,在这个方法中会启动一个特殊的类加载器 ShadowClassLoader ,加载同 jar 包下所有以 .SCL.lombok 结尾的类(Lombok 为了对 IDE 隐藏这些类,所以不是通常地以 .class 结尾)。其中就包含各式各样的 handler 。每个 handler 申明并处理一种注解,比如 @Getter 对应 HandleGetter 。

委派给 handler 时,Lombok Annotation Processor 会提供一个被注解节点的Abstract Syntax Tree (AST)节点对象,它可能是一个方法、属性或类。在 handler 中 可以对这个 AST 进行修改,之后编译器将从被修改后的 AST 生成字节码。

下面我们以 @KLog 为例,说明如何编写 Handler 。假设我们希望实现这样的效果:

源代码
@KLog public class Foo { }
生成后代码
public class Foo {
    private static final com.example.log.KLogger log = com.example.log.KLoggerFactory.getLogger(Foo.class);
}

KLog 可能是我们的日志类,在通用日志类的基础上做了一些扩展。 使用 @KLog 可以避免因复制粘贴代码导致入参错误,也有利于统一命名。为了实现这个注解,我们需要实现:

  • 创建 Javac Handler
  • 创建 Eclipse Handler
  • 创建 lombok-intellij-plugin Handler

前期准备:Fork Lombok 工程

我们需要先 fork Lombok 工程,项目中添加 Handler。前面谈到因为 shadow loader类加载的原因,在另外的工程中创建 Handler 将变得非常困难, lombok作者推荐直接fork lombok工程定制自己的 lombok.jar 

~ git clone https://github.com/rzwitserloot/lombok.git

需要注意的是,lombok 需要使用 JDK9 以上版本进行编译,确保系统路径配置了正确的 JAVA_HOME 路径,然后执行 ant maven 将构建可以用于安装本地仓库的 jar 包。 可以运行以下命令将构建的 jar 包安装到本地仓库进行工程间共享:

~ mvn install:install-file -Dfile=dist/lombok-{lombok-version}.jar -DpomFile=build/mavenPublish/pom.xml
<
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值