您现在的位置是:首页 > 编程 > 

【Bug】CGLIB与JDK17不兼容,依赖失效,模块化报错问题及解决方式ClassFormatError: accessible: module java.base does not ‘opens

2025-07-27 05:38:09
【Bug】CGLIB与JDK17不兼容,依赖失效,模块化报错问题及解决方式ClassFormatError: accessible: module java.base does not ‘opens  引入:本文面向人CGLIB代理与JDK9+版本不兼容导致的报错一:报错信息和相关代码展示代码语言:javascript代码运行次数:0运行复制public class DynamicMain {

【Bug】CGLIB与JDK17不兼容,依赖失效,模块化报错问题及解决方式ClassFormatError: accessible: module java.base does not ‘opens

 引入:本文面向人CGLIB代理与JDK9+版本不兼容导致的报错

一:报错信息和相关代码展示
代码语言:javascript代码运行次数:0运行复制
public class DynamicMain {
    public static void main(String[] args) {
        //subject可以翻译为对象,代理对象
        HouseSubject target= new RealHouseSubject();
        //创建一个代理对象
        HouseSubject proxy = (HouseSubject)
                (target.getClass(), new CGLIBInterceptor(target));
        proxy.rentHouse();
    }

}
代码语言:javascript代码运行次数:0运行复制
package springaop.brokerdemo2;

import lombok.val;
import net.proxy.MethodInterceptor;
import net.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.sql.SQLOutput;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Hua YY
 * Date: 2024-12-0
 * Time: 11:25
 */
public class CGLIBInterceptor implements MethodInterceptor {
    //目标对象,被代理的对象
    private Object target;
    public CGLIBInterceptor(Object target){
         = target;
    }

    @Override
    public Object intercept(Object o, Method method
            , Object[] objects, MethodProxy methodProxy) throws Throwable {
        //代理增强内容
        println("我是中介,开始代理");
        //调用方法(反射机制)
        Object retVal = method.invoke(target, objects);
        //代理增强内容
        println("我是中介,代理结束");
        return retVal;
    }
}
二:解决思路

首先想到的是JDK版本过高,于是改用JDK8,依然报错,于是降低CJLIB版本依赖,再分别进行测试依旧报错。 

三:错误原因

该错误的根本原因是 Java 9+ 模块化(JPMS)导致的问题。在 JDK 9 引入了模块系统之后,CGLIB 在动态生成代理类时,需要访问 java.lang.ClassLoader 的一些内部方法,但是 Java 的模块系统限制了对这些方法的访问。具体来说,java.base 模块没有开放 java.lang 包中的一些类和方法给其他模块,导致 CGLIB 无法访问这些方法,最终抛出了 InaccessibleObjectException

四:解决方式

修改 IDE 配置(如果使用 IntelliJ IDEA)

如果你是通过 IntelliJ IDEA 运行程序,可以在运行/调试配置中添加该参数:

  1. 打开 Run/Debug Configurati(运行/调试配置)。
  2. 到你的程序配置(例如 DynamicMain)。
  3. VM opti 字段中添加如下代码
代码语言:javascript代码运行次数:0运行复制
--add-opens java.base/java.lang=ALL-UAMED

4:具体操作步骤如下 

代码运行成功

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-1,如有侵权请联系 cloudcommunity@tencent 删除代理模块化javabugmodule

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1184093.html

相关标签:无
上传时间: 2025-07-22 07:07:33
留言与评论(共有 17 条评论)
本站网友 天机棒
9分钟前 发表
依赖失效
本站网友 中国剪报
23分钟前 发表
Object[] objects
本站网友 王克明
15分钟前 发表
objects); //代理增强内容 println("我是中介
本站网友 玛丽在隔壁
11分钟前 发表
module java.base does not ‘opens  引入:本文面向人CGLIB代理与JDK9+版本不兼容导致的报错一:报错信息和相关代码展示代码语言:javascript代码运行次数:0运行复制public class DynamicMain { public static void main(String[] args) { //subject可以翻译为对象
本站网友 银行贷款政策
2分钟前 发表
new CGLIBInterceptor(target)); proxy.rentHouse(); } }代码语言:javascript代码运行次数:0运行复制package springaop.brokerdemo2; import lombok.val; import net.proxy.MethodInterceptor; import net.proxy.MethodProxy; import java.lang.reflect.Method; import java.sql.SQLOutput; /** * Created with IntelliJ IDEA. * Description
本站网友 王晓宁
9分钟前 发表
代理对象 HouseSubject target= new RealHouseSubject(); //创建一个代理对象 HouseSubject proxy = (HouseSubject) (target.getClass()
本站网友 鱼腥草孕妇
25分钟前 发表
原始发表:2025-01-1
本站网友 增肥方法
17分钟前 发表
原始发表:2025-01-1
本站网友 怎样治疗早泄
1分钟前 发表
被代理的对象 private Object target; public CGLIBInterceptor(Object target){ = target; } @Override public Object intercept(Object o
本站网友 小儿口疮
13分钟前 发表
java.base 模块没有开放 java.lang 包中的一些类和方法给其他模块
本站网友 武夷山公馆大桥
4分钟前 发表
module java.base does not ‘opens  引入:本文面向人CGLIB代理与JDK9+版本不兼容导致的报错一:报错信息和相关代码展示代码语言:javascript代码运行次数:0运行复制public class DynamicMain { public static void main(String[] args) { //subject可以翻译为对象
本站网友 射干抗病毒注射液
16分钟前 发表
依赖失效
本站网友 综合维生素
28分钟前 发表
代理对象 HouseSubject target= new RealHouseSubject(); //创建一个代理对象 HouseSubject proxy = (HouseSubject) (target.getClass()
本站网友 北京萨莉亚
21分钟前 发表
模块化报错问题及解决方式ClassFormatError
本站网友 大皇后
6分钟前 发表
 三:错误原因该错误的根本原因是 Java 9+ 模块化(JPMS)导致的问题
本站网友 鸽子汤怎么炖
21分钟前 发表
accessible