电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

记一次cglib报错:MethodTooLargeException

来源:金蝶云社区作者:金蝶2024-09-164

记一次cglib报错:MethodTooLargeException

最近在升级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格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信