【发布时间】:2017-11-29 21:03:23
【问题描述】:
使用 Java 8 编译并使用 javap 转储生成的类文件后,我看到了这个,我只显示了前 2 项:
BootstrapMethods:
0: #174 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#175 (Ljava/lang/Object;)Z
#179 invokestatic llllll/lallll.lambda$printPersons$0:(Lllllll/lallll;)Z
#180 (Lllllll/lallll;)Z
1: #174 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
Method arguments:
#175 (Ljava/lang/Object;)Z
#191 invokestatic llllll/lallll.lambda$printPersons$1:(Lllllll/lallll;)Z
#180 (Lllllll/lallll;)Z
2: #174 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/inv
我可以使用 ASM 访问这些引导方法中的指令并更改例如使用上述 invokestatic 指令调用的方法的名称吗?
显然,这些方法不是类的普通方法的一部分,而且我没有任何运气使用标准 ASM 类和方法技术访问它们。
如果不使用 ASM,是否可以使用另一个 Java 字节码/类文件操作框架来查找和修改这些指令?
我一直在阅读 Java 的标准类文件格式文档,但没有看到对引导方法指令的直接描述,但我确实看到了我将描述为引导方法元数据的内容。
谢谢,
-大卫
【问题讨论】: