<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>QueryDSL - tag - 沐木</title><link>https://oldletter.cn/tags/querydsl/</link><description>QueryDSL - 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/querydsl/" 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></channel></rss>