JBoss类中的LocalVariableTable损坏

时间:2012-11-28 15:21:55

标签: java jboss bytecode java-bytecode-asm

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

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

公共同步字节[] 组织$ JBoss的JMS $ $ $客户委托$ 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:LocalVariableTable中的长度为65484无效 在类文件org / jboss / jms / client / delegate / ClientClusteredConnectionFactoryDe​​legate

任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我的一位同事发现了以下内容:如果由于某种原因,在原始字节码中LocalVariableTable包含无效的偏移量,这些偏移量不在指令的末尾,而是在其中间,然后在ASM访问之后,得到负补偿。解决方案是使用ASM的ClassReader.SKIP_DEBUG选项完全剥离调试信息。或者检测ASM何时无法确定局部变量的结束偏移量并在visitLocalVariable MethodAdapter方法中跳过该特定变量

答案 1 :(得分:0)

当您将不完整的字节数组(或流)作为ClassReader的输入传递时,通常会发生这种情况。您可以通过比较字节数组的大小以及将CheckClassAdapter添加到no-op转换访问链中来检查它。