<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Java on icebear&#39;s blog</title>
    <link>https://sfclub.cc/~icybear/tags/java/</link>
    <description>Recent content in Java on icebear&#39;s blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 06 Jul 2022 19:25:58 +0000</lastBuildDate>
    <atom:link href="https://sfclub.cc/~icybear/tags/java/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>「9&#43;」 Java 编译器插件教程 101</title>
      <link>https://sfclub.cc/~icybear/posts/extending-java-compiler/</link>
      <pubDate>Wed, 06 Jul 2022 19:25:58 +0000</pubDate>
      <guid>https://sfclub.cc/~icybear/posts/extending-java-compiler/</guid>
      <description>&lt;p&gt;写了上万行 Java 代码，相比你已经对 Java &amp;ldquo;木纳呆板&amp;quot;的语法恨之入骨了。&lt;/p&gt;
&lt;p&gt;那么，有没有一种可能，我是说可能，我们可以给 Java 编译器写插件？&lt;/p&gt;
&lt;p&gt;如果你要在面包店里买面包，你最好跟店员说你要买哪块面包。本文所指的 &lt;code&gt;Java 编译器&lt;/code&gt; 均为 OpenJDK 自带的那个 &lt;code&gt;javac&lt;/code&gt;，而不是其他的前端编译器实现。&lt;/p&gt;
&lt;h1 id=&#34;前言&#34;&gt;前言&lt;/h1&gt;
&lt;p&gt;自从 Java 8 起，Oracle 就将&lt;a href=&#34;https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/com/sun/source/util/Plugin.html&#34;&gt;插件&lt;/a&gt;系统引入了 &lt;code&gt;javac&lt;/code&gt; 中，因此是可以写 Javac 插件的。&lt;/p&gt;
&lt;p&gt;虽然写一个 Javac 插件并且修改代码是可能的，但是这方面的资料很少（国内就更少了），并且大多内容重复（教你写个 HelloWorld 然后就结束），其次 javac 的东西也不是很好摸，毕竟不是公开 API（ JDK 9+ 开始已经不暴露在外了）。&lt;/p&gt;
&lt;p&gt;恰逢今年还没写技术类的博客，就拿来磨磨刀吧。&lt;/p&gt;
&lt;h1 id=&#34;先从插件说起&#34;&gt;先从插件说起&lt;/h1&gt;
&lt;p&gt;上文刚刚提到了一个词，&lt;code&gt;插件&lt;/code&gt;。它其实正是 &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/jdk/api/javac/tree/com/sun/source/util/Plugin.html&#34;&gt;com.sun.source.util.Plugin&lt;/a&gt;。通过这个类，我们可以让 Javac 在编译时加载我们的代码。&lt;/p&gt;
&lt;p&gt;加载了代码，那么做什么呢？所以我们立一个目标：&lt;em&gt;给所有 &lt;code&gt;@Jsonized&lt;/code&gt; 标注过的类都生成一个可以输出 json 的 &lt;code&gt;toString()&lt;/code&gt; 方法。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;什么意思呢？就比如说这样一个类：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c678dd&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#c678dd&#34;&gt;class&lt;/span&gt; &lt;span style=&#34;color:#e5c07b&#34;&gt;MyResponse&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c678dd&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#c678dd&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;String&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;message&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c678dd&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#c678dd&#34;&gt;final&lt;/span&gt; &lt;span style=&#34;color:#e5c07b&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;success&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#c678dd&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#61afef;font-weight:bold&#34;&gt;MyResponse&lt;/span&gt;(&lt;span style=&#34;color:#e06c75&#34;&gt;String&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;message&lt;/span&gt;, &lt;span style=&#34;color:#e5c07b&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;success&lt;/span&gt;){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c678dd&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#e06c75&#34;&gt;message&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;message&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#c678dd&#34;&gt;this&lt;/span&gt;.&lt;span style=&#34;color:#e06c75&#34;&gt;success&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;success&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后你想把它序列化成 Json。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#abb2bf;background-color:#282c34;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#c678dd&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;response&lt;/span&gt; &lt;span style=&#34;color:#56b6c2&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#c678dd&#34;&gt;new&lt;/span&gt; &lt;span style=&#34;color:#e06c75&#34;&gt;MyResponse&lt;/span&gt;(&lt;span style=&#34;color:#98c379&#34;&gt;&amp;#34;\&amp;#34;Success!\&amp;#34; Took me 114514 yr 1919810 m&amp;#34;&lt;/span&gt;,&lt;span style=&#34;color:#e5c07b&#34;&gt;false&lt;/span&gt;).&lt;span style=&#34;color:#e06c75&#34;&gt;toString&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e06c75&#34;&gt;response&lt;/span&gt;.&lt;span style=&#34;color:#e06c75&#34;&gt;equals&lt;/span&gt;(&lt;span style=&#34;color:#98c379&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#98c379&#34;&gt;    {&amp;#34;message&amp;#34;: &amp;#34;\&amp;#34;Success!\&amp;#34; Took me 114514 yr 1919810 m&amp;#34;, &amp;#34;success&amp;#34;: false}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#98c379&#34;&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;又快又便捷，还不需要第三方类库，这就是我们的目标。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
