考虑以下旨在invokedynamic
使用 ASM 生成指令的代码:
// BOOTSTRAP = new Handle(->
// CallSite bootstrap(MethodHandles.Lookup caller, String name, MethodType methodType, Class<?> someClass)
mv.visitInvokeDynamicInsn("foo", "(I)I", BOOTSTRAP, Type.INT_TYPE);
使用 ASMifier 反编译生成的类时,相关行变为
mv.visitInvokeDynamicInsn("foo", "(I)I", new Handle(/* SNIP (same as BOOTSTRAP) */),
Type.getType("LI;"));
¯¯¯¯¯
如您所见,Type.INT_TYPE
已变成对名为 的引用类型的字面引用I
。由于这不存在,JVM 在运行时抱怨java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: I
.
相反,我想做的是将int.class
(Class
原始类型的实例int
,或Integer.TYPE
常量的值)传递给我的bootstrap
方法作为someClass
. 但是,ASM 似乎没有正确理解或支持这一点。
这是否可以被视为 ASM 错误,是否有解决方法?