我正在使用ASM 4.0并且遇到了来自JBoss发行版的org / jboss / jms / client / delegate / ClientClusteredConnectionFactoryDelegate.class类的奇怪问题
问题是在无操作转换之后,这个类的方法之一,
公共同步字节[] 组织$ JBoss的JMS $ $ $客户委托$ ClientClusteredConnectionFactoryDelegate $ 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 / ClientClusteredConnectionFactoryDelegate
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
我的一位同事发现了以下内容:如果由于某种原因,在原始字节码中LocalVariableTable包含无效的偏移量,这些偏移量不在指令的末尾,而是在其中间,然后在ASM访问之后,得到负补偿。解决方案是使用ASM的ClassReader.SKIP_DEBUG选项完全剥离调试信息。或者检测ASM何时无法确定局部变量的结束偏移量并在visitLocalVariable
MethodAdapter
方法中跳过该特定变量
答案 1 :(得分:0)
当您将不完整的字节数组(或流)作为ClassReader的输入传递时,通常会发生这种情况。您可以通过比较字节数组的大小以及将CheckClassAdapter添加到no-op转换访问链中来检查它。