我完成了一个 Java 库,并用它来替换java.lang.invoke
包(即,在正常 JVM 库之前将其添加到引导类加载器)。在包中,它为方法句柄动态生成字节码。如果您有任何关于这门课的信息,谢谢!
目前,这个包在带有测试用例的 JRuby 上运行良好,但是当我尝试用 Nashorn(JavaScript 语言的 Java 版本)测试它时它失败了。错误信息是:
java.lang.NoClassDefFoundError: jdk.nashorn.internal.scripts.JO28P0
at java.lang.invoke.DYNGuardWithTestHandle702.0000000051119BF0.<clinit>(Unknown Source)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:88)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:57)
at java.lang.reflect.Constructor.newInstance(Constructor.java:437)
at code.jit.asm.plugins.MethodHandlePlugin.initObject(MethodHandlePlugin.java:208)
at code.jit.asm.backplane.ClassContext.createTransformedObject(ClassContext.java:359)
at code.jit.asm.services.BytecodeGenerator$6.action(BytecodeGenerator.java:211)
at code.jit.asm.services.BytecodeGenerator.run(BytecodeGenerator.java:325)
at code.jit.asm.services.BytecodeGenerator.generate(BytecodeGenerator.java:291)
at code.jit.asm.services.BytecodeGenerator.startGenerating(BytecodeGenerator.java:257)
at code.jit.asm.services.TaskRepositoryService.put(TaskRepositoryService.java:48)
at code.jit.asm.services.BytecodeGenerator.generate(BytecodeGenerator.java:251)
at code.jit.asm.services.BytecodeGenerator.generate(BytecodeGenerator.java:247)
at java.lang.invoke.CallSite.jitMethodHandle(CallSite.java:125)
at java.lang.invoke.MutableCallSite.setTarget(MutableCallSite.java:116)
at jdk.internal.dynalink.ChainedCallSite.relinkInternal(ChainedCallSite.java:209)
at jdk.internal.dynalink.ChainedCallSite.relink(ChainedCallSite.java:161)
at jdk.nashorn.internal.runtime.linker.LinkerCallSite.relink(LinkerCallSite.java:154)
at jdk.internal.dynalink.DynamicLinker.relink(DynamicLinker.java:297)
at java.lang.invoke.DirectHandle.invokeExact_thunkArchetype_L(DirectHandle.java:291)
at java.lang.invoke.DYNFoldNonvoidHandle699.00000000525AABE0.inlinedMethod(Unknown Source)
at java.lang.invoke.MutableCallSiteDynamicInvokerHandle.invokeExact_thunkArchetype_X(MutableCallSiteDynamicInvokerHandle.java:56)
at jdk.nashorn.internal.scripts.Script$4$richards.:program(file:/C:/sxu/project/octane/richards.js:515)
at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:635)
at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:506)
at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:405)
at jdk.nashorn.internal.runtime.Context.evaluateSource(Context.java:1236)
at jdk.nashorn.internal.runtime.Context.load(Context.java:849)
at jdk.nashorn.internal.objects.Global.load(Global.java:1544)
除了例外,我在 nashorn 包中找不到任何类 JO28P0。我无法通过谷歌获得该课程的任何信息。
这里的 JS 来自 octane 基准测试,我在其中评论了除前两种情况之外的所有测试:
C:\\sxu\\project\\octane\\run.js
var base_dir = 'C:\\sxu\\project\\octane\\';
load(base_dir + 'base.js');
load(base_dir + 'richards.js');/*
load(base_dir + 'deltablue.js');
...
load(base_dir + 'typescript-compiler.js'); */
启动该案例的主要 Java 代码是:
public static void runOctane(String[] args) {
NashornScriptEngine nashorn = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn");
CompiledScript scr = nashorn.compile(new String(Files.readAllBytes(
Paths.get("C:\\sxu\\project\\octane\\run.js"))));
scr.eval();
}
一个 VM 参数是-Djit_bytecode=true
. 如果这个论点是真的,那么将去我的图书馆。否则,我的库将不会生效。
如果jit_bytecode
为假,则异常消失。
更新:
我的代码发出动态字节码,其中包含 symbol JO28P0
。当我尝试使用UNSAFE.defineAnonymousClass()
. 那么如何使用 Structure ClassLoaderUnsafe.defineAnonymousClass
才能成功呢?