记一次cglib报错:MethodTooLargeException
eas cloud知识来源:金蝶云社区作者:金蝶2024-09-164
本文目录[ 隐藏 ]

最近在升级3.3版本cglib包后领料出库单启用DEP报错。
net.sf.cglib.asm.$MethodTooLargeException: Method too large

DEP使用的是第三方开源包cglib实现方法前置脚本和后置脚本的执行,这里报错有个比较明显的提示
Method too large。
直译过来就是方法太大了,是哪个方法太大,也在异常下面给出了:getIndex。
我们都知道java文件会编译成class文件,方法体会编译成具体的指令。在java中规定了指令的最大条数,这个数字是用4个字节去存储所以,最多是65535条。
难道这个getIndex方法编译之后的指令已经超过了这个限制?
去代码中找这个方法,果然找不到,因为如果代码中有这么大的方法,编译器会直接报错的,不会到运行时才报错,很明显这个方法是cglib动态代理类中自动生成的。
查看cglib相关文档,在虚拟机参数中设置DebuggingClassWriter.DEBUG_LOCATION_PROPERTY参数,可以将动态代理类输出到指定的路径。
在代码中或者在虚拟机参数中按如下设置。
代码:
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:/cglibgenClass");
虚拟机参数:
EAS客户端在eas/client/bin/client.vmoptions文件中制定虚拟机参数。

当然就算设置了这个参数,也生成不了代理类,因为在生成的时候就会报错。
所以我们只能自己写个测试类测试一下。
测试类如下:
被代理类,有两个方法
package com.ice.yu;
public class KLen {
public void a1(){System.out.println("longMethodName");}
protected void a2(){System.out.println("longMethodName");}
}通过cglib代理一下
package com.ice.yu;
import net.sf.cglib.core.DebuggingClassWriter;
import net.sf.cglib.proxy.Enhancer;
public class MainClass {
public static void main(String[] args) {
System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "F:/cglibgenClass");
KLenProxy proxy = new KLenProxy();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(KLen.class);
enhancer.setCallback(proxy);
enhancer.setUseFactory(true);
KLen len = (KLen)enhancer.create();
System.out.println(len.getClass().getDeclaredMethods().length);
try {
len.a1();
} catch (Securi记一次cglib报错:MethodTooLargeException
最近在升级3.3版本cglib包后领料出库单启用DEP报错。net.sf.cglib.asm.$MethodTooLargeException: Method too largeDEP使用的是第三方开...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇
下一篇



