lombok-ex 编译时注解框架,性能完爆 AOP
lombok-ex
lombok-ex 是一款类似于 lombok 的编译时注解框架。
主要补充一些 lombok 没有实现,且自己会用到的常见工具。
编译时注解性能无任何损失,一个注解搞定一切,无三方依赖。
创作目的
补充 lombok 缺失的注解,便于日常开发使用。
lombok 的源码基本不可读,应该是加密处理了。
为其他注解相关框架提升性能提供基础,后期考虑替换为编译时注解。
特性
@Serial
序列化@Util
工具类@ToString
toString@Sync
同步@Modifiers
修饰符
变更日志
快速开始
准备工作
jdk1.7+
maven 3.x+
- 编译器启用编译时注解功能。
如 idea 启用编译时注解,勾选【enable annotation process】
maven 引入
<dependency>
<groupId>com.github.houbb</groupId>
<artifactId>lombok-ex</artifactId>
<version>0.0.7</version>
<scope>provided</scope>
</dependency>
- Gradle 引入方式
compile group: 'com.github.houbb', name: 'lombok-ex', version: '0.0.7'
@Serial 注解
- User.java
我们定义一个简单的 pojo,使用 @Serial
package com.github.houbb.lombok.test.model;
import com.github.houbb.lombok.ex.annotation.Serial;
@Serial
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
编译
直接使用 maven 命令编译
$ mvn clean install
编译结果
查看对应的 User.class 文件,内容如下:
package com.github.houbb.lombok.test.model;
import java.io.Serializable;
public class User implements Serializable {
private static final Long serialVersionUID = 1L;
private String name;
public User() {
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
@Util 注解
注解使用
@Util
public class StringUtil {
public static boolean isEmpty(final String string) {
return null == string || "".equals(string);
}
}
效果
public final class StringUtil {
private StringUtil() {
}
public static boolean isEmpty(String string) {
return null == string || "".equals(string);
}
}
@ToString 注解
简介
@ToString
注解在类上使用,可以默认生成 toString() 方法
例子:
import com.github.houbb.lombok.ex.annotation.ToString;
@ToString
public class ToStringTest {
}
效果
编译后的 class 文件信息:
ps: 此处依赖 FastJSON,请自行引入。
import com.alibaba.fastjson.JSON;
public class ToStringTest {
public ToStringTest() {
}
public String toString() {
return JSON.toJSONString(this);
}
}
@Sync 注解
使用
直接指定在方法上。
@Sync
public void syncTest() {
System.out.println("sync");
}
效果
public synchronized void syncTest() {
System.out.println("sync");
}
@Modifiers 注解
说明
@Modifiers
可修改类、方法、字段的访问级别。
暂时可能没有特别好的应用场景,取决于用户自己的使用。
注意:不要搞一些难以理解的东西,尽可能便于使用者理解。
使用方式
@Modifiers
还有一个 appendMode 属性,默认为 true。
如果设置为 false,可以直接将修饰符改为用户指定的。
import com.github.houbb.lombok.ex.annotation.Modifiers;
import com.github.houbb.lombok.ex.constant.Flags;
@Modifiers(Flags.FINAL)
public class ModifiersTest {
@Modifiers(Flags.VOLATILE)
private int value;
@Modifiers(Flags.SYNCHRONIZED)
public static void syncTest() {
System.out.println("sync");
}
}
效果
public final class ModifiersTest {
private volatile int value;
public ModifiersTest() {
}
public static synchronized void syncTest() {
System.out.println("sync");
}
}
开源地址
后期 Road-map
对于注解的开关配置以及编译优化
@AutoLog
实现完善@Equals
@HashCode
@EqualsAndHashCode
等内置方法重载@NotNull
参数校验,可以单独一个项目 valid@Async
异步执行 asyncbean-mapping, sensitive 等优化
AST 基础框架
思路:通过 AST 直接解析文本,然后通过 AST 结合 jdk utils 重新构建 class 文件。
原文链接
扫码关注一波~
lombok-ex 编译时注解框架,性能完爆 AOP的更多相关文章
- java 编译时注解框架 lombok-ex
lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...
- Android 打造编译时注解解析框架 这只是一个开始
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客 ...
- Android 编译时注解解析框架
2.注解 说道注解,竟然还有各种分类,得,这记不住,我们从注解的作用来反推其分类,帮助大家记忆,然后举例强化大家的记忆,话说注解的作用: 1.标记一些信息,这么说可能太抽象,那么我说,你见过@Over ...
- 使用编译时注解简单实现类似 ButterKnife 的效果
这篇文章是学习鸿洋前辈的 Android 如何编写基于编译时注解的项目 的笔记,用于记录我的学习收获. 读完本文你将了解: 什么是编译时注解 APT 编译时注解如何使用与编写 举个例子 思路 创建注解 ...
- 利用APT实现Android编译时注解
摘要: 一.APT概述 我们在前面的java注解详解一文中已经讲过,可以在运行时利用反射机制运行处理注解.其实,我们还可以在编译时处理注解,这就是不得不说官方为我们提供的注解处理工具APT (Anno ...
- Kotlin编译时注解,简单实现ButterKnife
ButterKnife在之前的Android开发中还是比较热门的工具,帮助Android开发者减少代码编写,而且看起来更加的舒适,于是简单实现一下ButterKnife,相信把下面的代码都搞懂,看Bu ...
- libgo协程库:网络性能完爆ASIO异步模型(-O3测试)
在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo 近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标 ...
- lombok编译时注解@Slf4j的使用及相关依赖包
slf4j是一个日志门面模式的框架,只对调用者开放少量接口用于记录日志 主要接口方法有 debug warn info error trace 在idea中可以引入lombok框架,使用@Slf4j注 ...
- 使用lombok.Data编译时无法找到get/set方法
我的IDEA版本是2019.2 在使用IDEA创建了一个SpringBoot项目,其中一个实体类使用了@Data注解,但是在Service中调用的时候找不到get/set方法. 检查步骤: 1.在St ...
- apt 根据注解,编译时生成代码
apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...
随机推荐
- [转帖]深度硬核文:Nginx的301重定向处理过程分析
https://zhuanlan.zhihu.com/p/84539204 本文首发于公众号:js-mindmap 一,序言 "晚上九点,办公室里烟雾缭绕,工作进度依然没有什么进展.王二胖打 ...
- ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes
ARMv8.0下duckdb的安装与编译过程-解决 Failed to allocate block of 2048 bytes 背景 duckdb 是一个很流行的单机版数据库引擎 同事下载了相关的预 ...
- TiDB恢复部分表的方式方法
TiDB恢复部分表的方式方法 背景 今天同事告知误删了部分表. 因为是UAT准生产的环境, 所以仅有每天晚上11点的备份处理. 同时告知 昨天的数据也可以. 得到认可后进行了 TiDB的单表备份恢复. ...
- [转帖]疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?
疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高? 因为存在CPU上下文切换. linux系统说明 Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行.当然,这些 ...
- [转帖]Oracle入门精读28-字符集 AL32UTF8与UTF8
字符(Character) 字符是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等. 字符编码(Character Encoding) 是一套法则,使用该法则能够对自然语言的字符的一个 ...
- Linux 查找并且复制部分文件到其他目录的办法(find xargs {})
最近经常需要从某些文件夹查找部分文件,然后复制到其他目录里面进行进一步的处理 shell 脚本一直在不断的学习中, 最近发现之前看文档还是有疏漏. find . -iname "*fi*&q ...
- MySQL in Windows安装以及异名恢复的简单过程
下载相关 建议获取最新版本的Mysql数据库 可以获取 zip 格式的安装文件 https://dev.mysql.com/downloads/mysql/ 或者获取 msi 格式的安装文件 http ...
- 批量删除一个月为tag的镜像的办法
第一步获取镜像列表 这是一个最简单的列转行. docker images |grep 20220401 |awk 'BEGIN{ORS=","}{print $1}' 第二步执行双 ...
- vue3新特性
值得注意的新特性 1==> 组合式 API 2==> Teleport 3==> 片段 4==> 触发组件选项 5==> createRenderer API 来自 @v ...
- 如何安装typescript-如何运行typescript
如何安装 typescript npm install typescript -g 安装 ts 之前需要安装 node 哈 查看 ts 的版本 tsc -V 我的是 3.6.3 的版本 typescr ...