<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>字节码 - tag - 沐木</title><link>https://oldletter.cn/tags/%E5%AD%97%E8%8A%82%E7%A0%81/</link><description>字节码 - tag - 沐木</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://oldletter.cn/tags/%E5%AD%97%E8%8A%82%E7%A0%81/" rel="self" type="application/rss+xml"/><item><title>深入字节码：ASM 和 Javac Plugin 如何真正解析 Lambda</title><link>https://oldletter.cn/posts/java-lambda-parse-03-bytecode-and-ast/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-03-bytecode-and-ast/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ ASM, 字节码, Javac Plugin, JVM | 📖 阅读约 30 分钟</p></blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>上一篇的两种方案（SerializedLambda、APT）有一个共同的限制：<strong>不能解析 Lambda 表达式</strong>，只能解析方法引用。</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-java">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title=""><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// ✅ 能解析 — 方法引用，有明确的方法名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Getter</span><span class="o">&lt;</span><span class="n">User</span><span class="p">,</span><span class="w"> </span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">getter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">::</span><span class="n">getAge</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ❌ 不能解析 — Lambda 表达式，方法名是 &#34;lambda$main$0&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Predicate</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">p</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">u</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">u</span><span class="p">.</span><span class="na">getAge</span><span class="p">()</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">18</span><span class="p">;</span></span></span></code></pre></div></div>
<p>这一篇的两种方案可以直接解析 <code>u -&gt; u.getAge() &gt; 18</code>，但代价是需要深入 JVM 底层。</p>
<hr>
<h2 id="方案-3-asm-字节码分析">方案 3: ASM 字节码分析</h2>
<h3 id="原理">原理</h3>
<p>Lambda 表达式编译后，编译器会生成一个<strong>私有静态方法</strong>，这个方法包含了 Lambda 的实际逻辑。比如：</p>]]></description></item></channel></rss>