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");
}
}

开源地址

https://github.com/houbb/lombok-ex

后期 Road-map

  • 对于注解的开关配置以及编译优化

  • @AutoLog 实现完善

  • @Equals @HashCode @EqualsAndHashCode 等内置方法重载

  • @NotNull 参数校验,可以单独一个项目 valid

  • @Async 异步执行 async

  • bean-mapping, sensitive 等优化

  • AST 基础框架

思路:通过 AST 直接解析文本,然后通过 AST 结合 jdk utils 重新构建 class 文件。

原文链接

扫码关注一波~

lombok-ex 编译时注解框架,性能完爆 AOP的更多相关文章

  1. java 编译时注解框架 lombok-ex

    lombok-ex lombok-ex 是一款类似于 lombok 的编译时注解框架. 编译时注,拥有运行时注解的便利性,和无任何损失的性能. 主要补充一些 lombok 没有实现,且自己会用到的常见 ...

  2. Android 打造编译时注解解析框架 这只是一个开始

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43452969 ,本文出自:[张鸿洋的博客] 1.概述 记得很久以前,写过几篇博客 ...

  3. Android 编译时注解解析框架

    2.注解 说道注解,竟然还有各种分类,得,这记不住,我们从注解的作用来反推其分类,帮助大家记忆,然后举例强化大家的记忆,话说注解的作用: 1.标记一些信息,这么说可能太抽象,那么我说,你见过@Over ...

  4. 使用编译时注解简单实现类似 ButterKnife 的效果

    这篇文章是学习鸿洋前辈的 Android 如何编写基于编译时注解的项目 的笔记,用于记录我的学习收获. 读完本文你将了解: 什么是编译时注解 APT 编译时注解如何使用与编写 举个例子 思路 创建注解 ...

  5. 利用APT实现Android编译时注解

    摘要: 一.APT概述 我们在前面的java注解详解一文中已经讲过,可以在运行时利用反射机制运行处理注解.其实,我们还可以在编译时处理注解,这就是不得不说官方为我们提供的注解处理工具APT (Anno ...

  6. Kotlin编译时注解,简单实现ButterKnife

    ButterKnife在之前的Android开发中还是比较热门的工具,帮助Android开发者减少代码编写,而且看起来更加的舒适,于是简单实现一下ButterKnife,相信把下面的代码都搞懂,看Bu ...

  7. libgo协程库:网络性能完爆ASIO异步模型(-O3测试)

    在purecpp社区的github组织中有一个协程库:https://github.com/yyzybb537/libgo 近日有用户找到我,想要了解一下libgo库在网络方面的性能,于是选取已入选标 ...

  8. lombok编译时注解@Slf4j的使用及相关依赖包

    slf4j是一个日志门面模式的框架,只对调用者开放少量接口用于记录日志 主要接口方法有 debug warn info error trace 在idea中可以引入lombok框架,使用@Slf4j注 ...

  9. 使用lombok.Data编译时无法找到get/set方法

    我的IDEA版本是2019.2 在使用IDEA创建了一个SpringBoot项目,其中一个实体类使用了@Data注解,但是在Service中调用的时候找不到get/set方法. 检查步骤: 1.在St ...

  10. apt 根据注解,编译时生成代码

    apt: @Retention后面的值,设置的为CLASS,说明就是编译时动态处理的.一般这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~ ...

随机推荐

  1. 【Python】.format用法

    格式化打印 print("***{}".format(args))   格式化转换 module = "skull" print "MODULE_{} ...

  2. 【MicroPython】用 c 添加接口 -- 框架介绍

    [来源]https://www.eemaker.com/micropython-c-kuangjia.html

  3. [转帖]Kafka可靠性之HW与Leader Epoch

    <深入理解Kafka:核心设计与实现原理>是基于2.0.0版本的书 在这本书中,终于看懂了笔者之前提过的几个问题 准备知识 1.leader里存着4个数据:leader_LEO.leade ...

  4. [转帖]Centos 7 查看磁盘io ,找出占用io读写很高的进程

    1,先用iostat查看磁盘io 是否读写负载很高 用iostat -x 1 10 如果 iostat 没有,要 yum install sysstat安装这个包,第一眼看下图红色圈圈的那个如果%ut ...

  5. [转帖]Springboot容器化镜像设置堆内存大小

    参考资料:Best Practices: Java Memory Arguments for Containers - DZone Java 有三种方式设置最大堆内存大小: 1. -Xmx 2. -X ...

  6. [转贴]win10临时修改、永久cmd 编码格式的方法

    https://www.jianshu.com/p/40a9fbaf1cac   cmd 前言 有时候,运行一些命令行程序某些字符无法正常显示,常见的就是方块,或者是火星文字都是由于 cmd 程序的默 ...

  7. 【计算几何,数学】7.14 T3 @ xdfz

    Problem Link 给定 \(n\) 个球和一个点 \(P\),求点 \(P\) 到这些球的交内一点的距离的最小值.保证有解.\(n\le 10^6\). 和最小圆覆盖一个套路.考虑维护一个当前 ...

  8. node+express+ multer 实现文件上传入门

    文件上传 文件上传需要借助一个中间件 multer 因此我们需要安装 cnpm install multer --save 前端界面 在express创建的项目下的 public/upload目录下创 ...

  9. Fabric区块链浏览器(3)

    本文是区块链浏览器系列的第五篇,项目完整代码在这里. 在上一篇文章中给浏览器增加了简单的用户认证,至此浏览器的基本功能就已经大致完成了. 在这片文章中,我将使用kratos对区块链浏览器器进行重构,使 ...

  10. Dubbo3应用开发—Dubbo注册中心引言

    Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理. 注册中心的运行流程 使用注册中心的好处 可以有效的 ...