- Notifications
You must be signed in to change notification settings - Fork26
Java compile time annotation, lombok extension framework.(java 编译时注解框架,对 lombok 进行扩展)
License
houbb/lombok-ex
Folders and files
| Name | Name | Last commit message | Last commit date | |
|---|---|---|---|---|
Repository files navigation
lombok-ex 是一款类似于 lombok 的编译时注解框架。
主要补充一些 lombok 没有实现,且自己会用到的常见工具。
编译时注解性能无任何损失,一个注解搞定一切,无三方依赖。
实现原理:编译时注解 + 编译原理 AST
补充 lombok 缺失的注解,便于日常开发使用。
lombok 的源码基本不可读,应该是加密处理了。
为其他注解相关框架提升性能提供基础,后期考虑替换为编译时注解。
@Serial 序列化
@Util 工具类
@ToString toString()
@Sync 同步
@Modifiers 修饰符
@UnsupportedOperation 不支持的操作
[@SPIAuto(#SPIAuto)] spi 自动生成文件
jdk1.7+
maven 3.x+
- 编译器启用编译时注解功能。
如 idea 启用编译时注解,勾选【enable annotation process】
<dependency> <groupId>com.github.houbb</groupId> <artifactId>lombok-ex</artifactId> <version>0.1.0</version> <scope>provided</scope></dependency>
- Gradle 引入方式
compile group: 'com.github.houbb', name: 'lombok-ex', version: '0.0.9'- User.java
我们定义一个简单的 pojo,使用@Serial
packagecom.github.houbb.lombok.test.model;importcom.github.houbb.lombok.ex.annotation.Serial;@SerialpublicclassUser {privateStringname;publicStringgetName() {returnname; }publicvoidsetName(Stringname) {this.name =name; }}
直接使用 maven 命令编译
$ mvn clean install查看对应的 User.class 文件,内容如下:
packagecom.github.houbb.lombok.test.model;importjava.io.Serializable;publicclassUserimplementsSerializable {privatestaticfinalLongserialVersionUID =1L;privateStringname;publicUser() { }publicStringgetName() {returnthis.name; }publicvoidsetName(Stringname) {this.name =name; }}
@UtilpublicclassStringUtil {publicstaticbooleanisEmpty(finalStringstring) {returnnull ==string ||"".equals(string); }}
publicfinalclassStringUtil {privateStringUtil() { }publicstaticbooleanisEmpty(Stringstring) {returnnull ==string ||"".equals(string); }}
@ToString 注解在类上使用,可以默认生成 toString() 方法
例子:
importcom.github.houbb.lombok.ex.annotation.ToString;@ToStringpublicclassToStringTest {}
编译后的 class 文件信息:
ps: 此处依赖 FastJSON,请自行引入。
importcom.alibaba.fastjson.JSON;publicclassToStringTest {publicToStringTest() { }publicStringtoString() {returnJSON.toJSONString(this); }}
@ToString 可以指定生成的方式,默认是 FastJson,目前还支持基于字符串拼接的方式:
@ToString(ToStringType.CONCAT)publicclassToStringConcatTest {privateStringname;privateintage;privateint[]ints;}
importjava.util.Arrays;publicclassToStringConcatTest {privateStringname;privateintage;privateint[]ints;publicToStringConcatTest() { }publicStringtoString() {return"ToStringConcatTest{name=" +this.name +", age=" +this.age +", ints=" +Arrays.toString(this.ints) +"}"; }}
直接指定在方法上。
@SyncpublicvoidsyncTest() {System.out.println("sync");}
publicsynchronizedvoidsyncTest() {System.out.println("sync");}
@Modifiers 可修改类、方法、字段的访问级别。
暂时可能没有特别好的应用场景,取决于用户自己的使用。
注意:不要搞一些难以理解的东西,尽可能便于使用者理解。
@Modifiers 还有一个 appendMode 属性,默认为 true。
如果设置为 false,可以直接将修饰符改为用户指定的。
importcom.github.houbb.lombok.ex.annotation.Modifiers;importcom.github.houbb.lombok.ex.constant.Flags;@Modifiers(Flags.FINAL)publicclassModifiersTest {@Modifiers(Flags.VOLATILE)privateintvalue;@Modifiers(Flags.SYNCHRONIZED)publicstaticvoidsyncTest() {System.out.println("sync"); }}
publicfinalclassModifiersTest {privatevolatileintvalue;publicModifiersTest() { }publicstaticsynchronizedvoidsyncTest() {System.out.println("sync"); }}
@UnsupportedOperation 可以放在方法、构造器上,用于说明当前方法不支持。
等价于throw new UnsupportedOperationException();
@UnsupportedOperationpublicstaticvoidadd() {}
publicstaticvoidadd() {ExceptionUtil.throwException(UnsupportedOperationException.class);}
该注解配合SPI 应用使用。
- SayGood.java
@SPIAuto("good")publicclassSayGoodimplementsSay{@Overridepublicvoidsay() {System.out.println("good"); }}
- SayBad.java
@SPIAuto("bad")publicclassSayBadimplementsSay{@Overridepublicvoidsay() {System.out.println("bad"); }}
编译后在对应目录下生成文件com.github.houbb.lombok.ex.test.spi.Say
内容如下:
good=com.github.houbb.lombok.ex.test.spi.SayGoodbad=com.github.houbb.lombok.ex.test.spi.SayBad此处以@ToString 为例,其他条件保持一致。进行 10W 次输出耗时统计。
可见编译时注解和原生写法耗时一致(原理是一样的),优于 FastJSON 基于运行时注解的实现。
对于注解的开关配置以及编译优化
@AutoLog实现完善@Equals@HashCode@EqualsAndHashCode等内置方法重载@NotNull参数校验,可以单独一个项目valid@Async异步执行asyncAST 基础框架
思路:通过 AST 直接解析文本,然后通过 AST 结合 jdk utils 重新构建 class 文件。
About
Java compile time annotation, lombok extension framework.(java 编译时注解框架,对 lombok 进行扩展)
Topics
Resources
License
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Releases
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors2
Uh oh!
There was an error while loading.Please reload this page.