我正在使用jasmin,并尝试启动我的.class文件,该文件应该执行简单的字符串连接。我的jasmin源码如下所示:
.class public default_class
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit locals 1
.limit stack 1
invokestatic main_65428301()I
return
.end method
.method public static main_65428301()I
.limit locals 1
.limit stack 100
new java/lang/String
dup
ldc "foo"
invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;
invokespecial java/lang/StringBuilder(Ljava/lang/String;)V
ldc "bar"
invokevirtual java/lang/StringBuilder.append(Ljava/lang/String;)Ljava/lang/StringBuilder;
invokevirtual java/lang/String.toString()V
astore_0
iconst_0
ireturn
.end method现在我可以运行java -jar jasmin.jar了,我得到了default_class.class。然而,当我尝试像java default_class一样启动它时,我得到了一个错误:
Exception in thread "main" java.lang.VerifyError: (class: default_class, method: main_65428301 signature: ()I) Illegal use of nonvirtual function call我应该在我的程序集中进行哪些更改才能使其正常工作?
发布于 2013-01-05 22:05:08
在JVM中,要创建对象,必须先使用new指令,然后调用<init>方法(构造函数)。您不会创建new StringBuilder并调用错误的构造函数名称(应该是java/lang/StringBuilder/<init>(Ljava/lang/String;)V)。
我也看不出有什么理由这样做:
new java/lang/String
dup或
invokestatic java/lang/String.valueOf(Ljava/lang/Object;)Ljava/lang/String;发布于 2013-01-05 22:06:07
“新指令不会完全创建新实例;在未初始化的实例上调用实例初始化方法之前,实例初始化不会完成。”
https://stackoverflow.com/questions/14172352
复制相似问题