1

ASMを使用して生成したクラスを読み込もうとすると、予期されるClassVerifyErrorsが発生します。さらに詳しく調べると、jvmが正しく、メソッドが話しているMAX_STACK値が無効であることがわかります。奇妙なことに、スタックと最大ローカルオプションの自動計算を使用しているので、これは問題にはなりません...無効なオプションを使用する方法は非常に単純ですが、結果は不正なバイトコードになります。

目的のメソッドを使用してクラスを作成し、asmで生成されたクラスをjavacが生成するクラスと比較しました。バイトコードの一致は、最大スタックが0であり、javacが値2を設定しているときに間違っています。

最大スタック/ローカルを自分で計算する必要はありません。

4

1 に答える 1

6

バイトコードが有効でない場合、最大スタックと変数の計算で間違った結果が生成される可能性があります。CheckClassAdapterを介して生成されたコードを実行することで、それを確認できます。

例えば、

  ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
  // generate code into cw instance...

  PrintWriter pw = new PrintWriter(System.out);
  CheckClassAdapter.verify(new ClassReader(cw.toByteArray()), true, pw);
于 2010-02-10T18:17:20.783 に答える