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を呼び出す必要があります。StringBuilderを<init>作成せず、間違ったコンストラクター名を呼び出します(そうする必要があります)。newjava/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 に答える