我正在使用ASM4.0,在使用JBoss发行版的org/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDelegate.class类时遇到了一个奇怪的问题
问题是,在对这个类的一个方法进行无操作转换后,
公共同步的org$jboss$jms$client$delegate$ClientClusteredConnectionFactoryDelegate$getClientAOPStack$aop() byte[]具有以下特性
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;因此,我在类文件org/jboss/jms/client/delegate/ClientClusteredConnectionFactoryDelegate的LocalVariableTable中有java.lang.ClassFormatError: Invalid length 65484
有人能帮我解决这个问题吗?
发布于 2012-12-02 00:54:23
我的一个同事发现:如果由于某种原因,在原始字节码LocalVariableTable中包含无效的偏移量,这些偏移量不是指向指令的末尾,而是位于指令的中间,那么在使用ASM访问之后,就会得到负的偏移量。解决方案是通过使用ASM的ClassReader.SKIP_DEBUG选项完全剥离调试信息。或者检测ASM何时无法确定局部变量的结束偏移量,并在MethodAdapter的visitLocalVariable方法中跳过该特定变量
发布于 2012-11-28 23:43:00
当您将不完整的字节数组(或流)作为输入传递到ClassReader时,通常会发生这种情况。您可以通过比较字节数组的大小和将CheckClassAdapter添加到无操作转换访问者链中来检查这一点。
https://stackoverflow.com/questions/13608442
复制相似问题