这里说:
Since 2.1 :
[..]
added the invokedynamic instruction
因此,我认为可以使用 jasmin 编写包含调用动力学的指令代码。但是我找不到关于 jasmin 语法的任何文档,我只是想出了如何使用 invokedynamic 来获取 Jasmin 的 VerifyErrors,但不知道如何创建一个工作示例。
这个指令如何在 Jasmin 中正确使用?
这里说:
Since 2.1 :
[..]
added the invokedynamic instruction
因此,我认为可以使用 jasmin 编写包含调用动力学的指令代码。但是我找不到关于 jasmin 语法的任何文档,我只是想出了如何使用 invokedynamic 来获取 Jasmin 的 VerifyErrors,但不知道如何创建一个工作示例。
这个指令如何在 Jasmin 中正确使用?
每个invokedynamic
字节码都应该引用一个相应的调用站点说明符(JVMS 6.5),它实际上是一个CONSTANT_InvokeDynamic
类型为(JVMS 4.4.10)的常量池条目。
Jasmin ( http://jasmin.sourceforge.net ) 不支持CONSTANT_InvokeDynamic
,但 Sable/jasmin 支持。虽然invokedynamic
在手写汇编中使用是忘恩负义的工作。
这是一个返回引用的动态方法示例System.out
:
.class public HelloWorld
.super java/lang/Object
.method public <init>()V
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 1
invokedynamic "getPrintStream" ()Ljava/io/PrintStream; HelloWorld/bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;()
ldc "Hello, world"
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
return
.end method
.method private static bootstrap(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
.limit stack 6
.limit locals 3
new java/lang/invoke/ConstantCallSite
dup
aload_0
ldc java/lang/System
ldc "out"
ldc java/io/PrintStream
invokevirtual java/lang/invoke/MethodHandles$Lookup/findStaticGetter(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/invoke/MethodHandle;
invokespecial java/lang/invoke/ConstantCallSite/<init>(Ljava/lang/invoke/MethodHandle;)V
areturn
.end method