1

ASM 4.0 を使用していますが、JBoss ディストリビューションの org/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDe​​legate.class クラスで奇妙な問題が発生しました。

問題は、ノーオペレーション変換の後、このクラスのメソッドの 1 つが、

public synchronized byte[] org$jboss$jms$client$delegate$ClientClusteredConnectionFactoryDe​​legate$getClientAOPStack$aop() には以下があります

  LineNumberTable:
    line 232: 0
    line 240: 52
    line 242: 77

   LocalVariableTable:
    Start  Length  Slot  Name   Signature
    52      -52      2    aopStackProvider
Lorg/jboss/jms/delegate/ConnectionFactoryDelegate;
    0      0      2    e
Lorg/jboss/jms/exception/MessagingNetworkFailureException;
    36      -36      1    server       I
    0      0      0    this
Lorg/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDelegate;

そして、変換前は次のとおりでした。

   LineNumberTable:
    line 232: 0
    line 234: 34
    line 238: 45
    line 240: 52
    line 242: 77
    line 244: 84
    line 246: 85
    line 234: 116
    line 250: 122

   LocalVariableTable:
    Start  Length  Slot  Name   Signature
    52      32      2    aopStackProvider
Lorg/jboss/jms/delegate/ConnectionFactoryDelegate;
    85      31      2    e
Lorg/jboss/jms/exception/MessagingNetworkFailureException;
    36      86      1    server       I
    0      132      0    this
Lorg/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDelegate;

その結果、java.lang.ClassFormatError: Invalid length 65484 in LocalVariableTable in class file org/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDe​​legate があります

誰でもこの問題を解決できますか?

4

2 に答える 2

1

私の同僚は次のことを発見しました: 何らかの理由で、元のバイトコード LocalVariableTable に無効なオフセットが含まれている場合、それは命令の最後ではなく、命令の途中を指している場合、ASM によってアクセスした後、負のオフセットが取得されます。 . 解決策は、ASM の ClassReader.SKIP_DEBUG オプションを使用して、デバッグ情報を完全に削除することです。または、ASM がローカル変数の終了オフセットを判別できない場合を検出し、その特定の変数を次のvisitLocalVariableメソッドでスキップします。MethodAdapter

于 2012-12-01T16:54:23.470 に答える
0

これは通常、不完全なバイト配列 (またはストリーム) を ClassReader への入力として渡すときに発生します。バイト配列のサイズを比較し、CheckClassAdapter を no-op 変換ビジター チェーンに追加することで確認できます。

于 2012-11-28T15:42:59.863 に答える