96SEO 2026-08-12 12:28 39
大家在日常开发中应该都用过 Lambda 表达式。按理说,以下面的 java 代码为例,我们在运行 HelloWorld 中的 main 方法时可以看到变量 r 的类型信息。但是在编译时、运行时都没有看到 r 对应的类文件。很多同学都会遇到下面的困惑:
.class 文件。
有没有办法将 r 对应的类保存到 .class 文件里呢?这篇文章会对此聊聊,

public class HelloWorld {
public static void main {
Runnable r = -> System.out.println;r.run,System.out.println.getName);按理说,}
}
运行 java 命令时使用以下任意一个 JVM 参数,都可以把 Lambda 表达式对应的类自动保存到磁盘:
-Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles-Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles=true使用如下命令可以查看当前 JDK 的编译器版本:
javac -version
从示例输出来看。javac 17.0.2
使用如下命令可以查看运行时 JDK 版本:
java -version
示例输出的观点是,openjdk version "17.0.2" 2023-01-17 LTS
OpenJDK Runtime Environment
OpenJDK 64-Bit Server VM
将下面的代码保存为 HelloWorld.java
public class HelloWorld {
public static void main {
Runnable r = -> System.out.println;r.run,System.out.println.getName);}
}
使用下面的命令编译源码:
javac -parameters HelloWorld.java
编译后目录结构示例:
.
├── HelloWorld.class
└── HelloWorld.java
直接运行得到的输出类似于:
java HelloWorld
Hello World
class name of r: HelloWorld$$Lambda/0x000000d001000a00
此时目录中仍然只有原始的 HelloWorld.class**,没有任何 Lambda 的实现文件。
使用前面提到的 JVM 参数之一启动程序,使得 JIT 在生成代理类时将其写入磁盘:
java -Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles HelloWorld
执行 tree . 会看到新增目录和文件:
.
├── DUMP_LAMBDA_PROXY_CLASS_FILES
│ └── HelloWorld$$Lambda.0x000000f801000a00.class
├── HelloWorld.class
└── HelloWorld.java
使用 查看字节码细节:
javap -v -p DUMP_LAMBDA_PROXY_CLASS_FILES/*class
// 手动反编译后的结果 final class HelloWorld$$Lambda implements java.lang.Runnable { private HelloWorld$$Lambda { super;} public void run { HelloWorld.lambda$main$;} } codelang=java>
Lambdas 是通过合成方法 ) 实现的。对应源码中的隐藏具体如下所示:
// 合成方法 lambda$main$ private static void lambda$main$ { System.out.println;} codelang=java>
import java.util.function.IntConsumer;import java.util.function.IntPredicate;import java.util.function.Predicate;import java.util.function.Supplier;public class SimpleCode { public static void main { Runnable runnable = -> System.out.println; Supplier supplier = -> "Hello World";IntPredicate predicate = -> num % 2 == 0;// 判断是否为偶数 IntConsumer consumer = System.out::println;System.out.println.getName);System.out.println.getName);System.out.println.getName);System.out.println.getName);} } "
javac -parameters SimpleCode.java java -Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles SimpleCode
A typical console output :
SimpleCode$$Lambda/0x000000b801000a00 SimpleCode$$Lambda/0x000000b801000c18 SimpleCode$$Lambda/0x000000b801001000 SimpleCode$$Lambda/0x000000b801001248 "
The directory now contains four generated proxy classes:
. ├── DUMP_LAMBDA_PROXY_CLASS_FILES │ ├── SimpleCode$$Lambda.0x000000b801000a00.class │ ├── SimpleCode$$Lambda.0x000000b801000c18.class │ ├── SimpleCode$$Lambda.0x000000b801001000.class │ └── SimpleCode$$Lambda.0x000000b801001248.class ├── SimpleCode.class └── SimpleCode.java "
// 手动反编译结果
final class SimpleCode$$Lambda implements java.lang.Runnable {
private SimpleCode$$Lambda { super;}
public void run { SimpleCode.lambda$main$;}
}
"
final class SimpleCode$$Lambda implements java.util.function.Supplier {
private SimpleCode$$Lambda { super;}
public Object get { return SimpleCode.lambda$main$;}
}
"
java
public class SimpleC ode {
...
private static boolean lambda$main${return arg0%2==0;}
private static String lambda$ma in${return \"Hello World\";}
private static void lambda$main${...}
}
\
\
小结只需在启动 Java 程序时加上 ‑Djdk.invoke.LambdaMetafactory.dumpProxyClassFiles所有由 invokedynamic 动态生成的 Lambda 实现都会被写入磁盘,方便调试、审计或二次加工。
text
@startuml
' title i>HelloWorld/i 的简要类图
caption
' caption 用于防止网站水印遮盖文字
class HelloWorld {
+ HelloWorld
+ {static} void main
- {static} void lambda$main$
}
interface java.lang.Runnable
class HelloWorld$$Lambd a implements java.lang.Runnable {
- HelloWor ld$$Lambd a
+ void run
}
note left of HelloWor ld$$Lambd a::run
public void run {
Hell oWor ld.lambda$mai n$;}
note end
note left of Hel loWor ld::lambda $mai n$
i lambda $mai n $ is a syntic method.
@enduml
text
@startuml
' title i
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback