1

我正在使用 ASM 4.0,并且遇到了 JBoss 发行版中的 org/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDe​​legate.class 类的一个奇怪问题

问题是,在这个类的方法之一的无操作转换之后,

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 添加到无操作转换访问者链中来检查这一点。

于 2012-11-28T15:42:59.863 回答