<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>SerializedLambda - tag - 沐木</title><link>https://oldletter.cn/tags/serializedlambda/</link><description>SerializedLambda - 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/serializedlambda/" rel="self" type="application/rss+xml"/><item><title>编译期方案：用 SerializedLambda 和注解处理器提取属性名</title><link>https://oldletter.cn/posts/java-lambda-parse-02-compile-time/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-02-compile-time/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ MyBatis Plus, QueryDSL, SerializedLambda, APT | 📖 阅读约 25 分钟</p></blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>上一篇说了 Java 的 Lambda 编译后丢失了 AST 信息，不能类似 C# 一样直接解析。但框架开发者们没有放弃，而是找到了其他办法。</p>
<p>这一篇讲两种<strong>编译期方案</strong>：它们不解析 Lambda 本身，而是利用 Java 的其他机制来提取属性信息。</p>
<ul>
<li><strong>方案 1: SerializedLambda</strong> — MyBatis Plus 用的方式，从方法引用中提取 getter 方法名</li>
<li><strong>方案 2: Annotation Processor</strong> — QueryDSL 用的方式，编译期扫描实体字段，生成元模型类</li>
</ul>
<hr>
<h2 id="方案-1-serializedlambdamybatis-plus-路线">方案 1: SerializedLambda（MyBatis Plus 路线）</h2>
<h3 id="发现过程">发现过程</h3>
<p>这个方案的关键发现是：<strong>当一个 Lambda 表达式实现了 <code>Serializable</code> 接口时，Java 编译器会额外生成一个 <code>writeReplace()</code> 方法</strong>。</p>
<p>这个方法返回一个 <code>SerializedLambda</code> 对象，里面包含了：</p>
<ul>
<li><code>implClass</code> — 实现方法所在的类名</li>
<li><code>implMethodName</code> — 实现方法的方法名</li>
<li><code>implMethodSignature</code> — 方法签名</li>
<li><code>capturedArgCount</code> — 捕获的外部变量数量</li>
</ul>
<p>对于 <code>User::getAge</code> 这种方法引用，<code>implMethodName</code> 就是 <code>&quot;getAge&quot;</code>，这就是我们要的属性信息。</p>]]></description></item><item><title>JDK 8 vs 17 vs 26：Lambda 解析性能实测</title><link>https://oldletter.cn/posts/java-lambda-parse-05-benchmark/</link><pubDate>Wed, 10 Jun 2026 00:00:00 +0000</pubDate><author>mumu</author><guid>https://oldletter.cn/posts/java-lambda-parse-05-benchmark/</guid><description><![CDATA[<blockquote>
<p>📅 2026-06-10 | 🏷️ JVM, 性能, JMH, JDK | 📖 阅读约 20 分钟</p></blockquote>
<hr>
<h2 id="前言">前言</h2>
<p>前四篇实现了五条 Lambda 解析路线。这一篇用 JMH 在三个 JDK 版本上跑基准测试，看看：</p>
<ol>
<li>五条路线的性能差距到底有多大？</li>
<li>JDK 升级对性能有多大影响？</li>
<li>实际使用中应该怎么选？</li>
</ol>
<hr>
<h2 id="测试环境">测试环境</h2>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <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><pre tabindex="0"><code>硬件: macOS ARM64 (Apple Silicon)
JDK 8:  BellSoft Liberica JDK 8u422 (aarch64)
JDK 17: Homebrew OpenJDK 17.0.19
JDK 26: Homebrew OpenJDK 26.0.1
JMH:    1.37</code></pre></div>
<p>JMH 参数：</p>
<ul>
<li>Fork = 2（2 个 JVM 进程，避免 JVM 特异性）</li>
<li>Warmup = 5（5 轮预热）</li>
<li>Measurement = 8（8 轮测量）</li>
<li>Mode = AverageTime（平均耗时，越小越好）</li>
</ul>
<hr>
<h2 id="重要前提缓存">重要前提：缓存</h2>
<p><strong>实际使用中，所有框架都会缓存解析结果。</strong></p>]]></description></item></channel></rss>