前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【Bug】CGLIB与JDK17不兼容,依赖失效,模块化报错问题及解决方式ClassFormatError: accessible: module java.base does not ‘opens

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

作者头像
三三是该溜子
发布2025-01-13 08:16:53
发布2025-01-13 08:16:53
20800
代码可运行
举报
文章被收录于专栏:该溜子的专栏
运行总次数:0
代码可运行

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

一:报错信息和相关代码展示

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

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

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

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

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

    @Override
    public Object intercept(Object o, Method method
            , Object[] objects, MethodProxy methodProxy) throws Throwable {
        //代理增强内容
        System.out.println("我是中介,开始代理");
        //调用方法(反射机制)
        Object retVal = method.invoke(target, objects);
        //代理增强内容
        System.out.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 Configurations(运行/调试配置)。
  2. 找到你的程序配置(例如 DynamicMain)。
  3. VM options 字段中添加如下代码
代码语言:javascript
代码运行次数:0
复制
--add-opens java.base/java.lang=ALL-UNNAMED

4:具体操作步骤如下 

代码运行成功

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

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:报错信息和相关代码展示
  • 二:解决思路
  • 三:错误原因
  • 四:解决方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档