「9+」 Java 编译器插件教程 101

写了上万行 Java 代码,相比你已经对 Java “木纳呆板"的语法恨之入骨了。 那么,有没有一种可能,我是说可能,我们可以给 Java 编译器写插件? 如果你要在面包店里买面包,你最好跟店员说你要买哪块面包。本文所指的 Java 编译器 均为 OpenJDK 自带的那个 javac,而不是其他的前端编译器实现。 前言 自从 Java 8 起,Oracle 就将插件系统引入了 javac 中,因此是可以写 Javac 插件的。 虽然写一个 Javac 插件并且修改代码是可能的,但是这方面的资料很少(国内就更少了),并且大多内容重复(教你写个 HelloWorld 然后就结束),其次 javac 的东西也不是很好摸,毕竟不是公开 API( JDK 9+ 开始已经不暴露在外了)。 恰逢今年还没写技术类的博客,就拿来磨磨刀吧。 先从插件说起 上文刚刚提到了一个词,插件。它其实正是 com.sun.source.util.Plugin。通过这个类,我们可以让 Javac 在编译时加载我们的代码。 加载了代码,那么做什么呢?所以我们立一个目标:给所有 @Jsonized 标注过的类都生成一个可以输出 json 的 toString() 方法。 什么意思呢?就比如说这样一个类: public class MyResponse { private final String message; private final boolean success; public MyResponse(String message, boolean success){ this.message = message; this.success = success; } } 然后你想把它序列化成 Json。 var response = new MyResponse("\"Success!\" Took me 114514 yr 1919810 m",false).toString(); response.equals(""" {"message": "\"Success!\" Took me 114514 yr 1919810 m", "success": false} """); 又快又便捷,还不需要第三方类库,这就是我们的目标。 ...

July 6, 2022 · 7 min · 1436 words