⑨ SneakyThrows 使用public class ThrowsTest {@SneakyThrows()public void read() {InputStream inputStream = new FileInputStream("");}@SneakyThrowspublic void write() {throw new UnsupportedEncodingException();}// 相当于public void read() throws FileNotFoundException {InputStream inputStream = new FileInputStream("");}public void write() throws UnsupportedEncodingException {throw new UnsupportedEncodingException();}}⑩ Synchronized 使用public class SynchronizedDemo {@Synchronizedpublic static void hello() {System.out.println("world");}// 相当于private static final Object $LOCK = new Object[0];public static void hello() {synchronized ($LOCK) {System.out.println("world");}}}? Getter(lazy = true) 使用public class GetterLazyExample {@Getter(lazy = true)private final double[] cached = expensive();private double[] expensive() {double[] result = new double[1000000];for (int i = 0; i < result.length; i++) {result[i] = Math.asin(i);}return result;}}// 相当于import java.util.concurrent.atomic.AtomicReference;public class GetterLazyExample {private final AtomicReference原理分析我们知道 Java 的编译过程大致可以分为三个阶段:
- 解析与填充符号表
- 注解处理
- 分析与字节码生成

文章插图
而 Lombok 正是利用「注解处理」这一步进行实现的 , Lombok 使用的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器) , 它是在编译期时把 Lombok 的注解代码 , 转换为常规的 Java 方法而实现优雅地编程的 。
这一点可以在程序中得到验证 , 比如本文刚开始用 @Data 实现的代码:

文章插图
在我们编译之后 , 查看 Person 类的编译源码发现 , 代码竟然是这样的:

文章插图
可以看出 Person 类在编译期被注解翻译器修改成了常规的 Java 方法 , 添加 Getter、Setter、equals、hashCode 等方法 。
Lombok 的执行流程如下:

文章插图
可以看出 , 在编译期阶段 , 当 Java 源码被抽象成语法树 (AST) 之后 , Lombok 会根据自己的注解处理器动态的修改 AST , 增加新的代码 (节点) , 在这一切执行之后 , 再通过分析生成了最终的字节码 (.class) 文件 , 这就是 Lombok 的执行原理 。
手撸一个 Lombok我们实现一个简易版的 Lombok 自定义一个 Getter 方法 , 我们的实现步骤是:
- 自定义一个注解标签接口 , 并实现一个自定义的注解处理器;
- 利用 tools.jar 的 javac api 处理 AST (抽象语法树)
- 使用自定义的注解处理器编译代码 。
1.定义自定义注解和注解处理器首先创建一个 MyGetter.java 自定义一个注解 , 代码如下:
- 保护企鹅的文章 保护企鹅我们应该做些什么
- 托福是什么意思
- 听力练习
- 冷冬来袭,温暖的房间可能暗藏危险
- 如何测试儿童智商 测小孩子的智商
- 倩女幽魂端游表情包 倩女幽魂游戏表情头像
- 人有永远不死的吗 永远不死的生物是什么
- 十首最气势磅礴的歌曲 气势磅礴的音乐有哪些
- 招投标项目管理师 项目管理师考试
- 青岛万象山 万象城 风水
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
