2

我正在玩 jasmin,我尝试启动我的 .class 文件,该文件应该执行简单的字符串连接。我的茉莉源看起来像这样:

.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

我应该在我的程序集中进行什么更改才能使其正常工作?

4

2 回答 2

1

在 JVM 中,要创建对象,您必须首先使用new指令,然后调用<init>方法(构造函数)。您没有创建newStringBuilder 并调用了错误的构造函数名称(应该是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-05T14:05:08.453 回答
0

“新指令并未完全创建新实例;在未初始化的实例上调用实例初始化方法之前,实例初始化不会完成。”

于 2013-01-05T14:06:07.233 回答