You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义ClassLoader加载类后无法直接实例化的问题求助

解决自定义类加载器下直接实例化类的问题

首先明确你的报错原因:
当你用CustomClassLoader加载Core类后,执行new Core()时,JVM会使用当前代码所在类的类加载器(通常是系统类加载器AppClassLoader)去尝试加载Core类。由于系统类加载器的类路径中找不到Core,且它和自定义类加载器加载的Core属于不同的类实例(类的唯一性由「全限定名+类加载器」共同决定),因此抛出NoClassDefFoundError。

下面给出两种符合你需求的解决方案:

方案1:让执行代码与目标类使用同一类加载器

把包含new Core()的代码所在类,也交给自定义类加载器加载。这样当这段代码执行时,会使用自定义类加载器去加载Core,自然能找到已加载的类实例。

示例代码:

// 假设你的执行代码在Main类中
CustomClassLoader classLoader = new CustomClassLoader();
// 加载Main类
Class<?> mainClass = classLoader.loadClass("me.micartey.test.Main");
// 调用Main中的方法执行new Core()
mainClass.getMethod("execute").invoke(mainClass.newInstance());

Main类的实现:

public class Main {
    public void execute() {
        // 这里可以直接实例化Core,无需反射或loadClass
        Core core = new Core();
    }
}

方案2:利用线程上下文类加载器

将当前线程的上下文类加载器设置为自定义类加载器,部分场景下JVM会使用这个类加载器加载依赖类。

示例代码:

CustomClassLoader classLoader = new CustomClassLoader();
// 设置线程上下文类加载器
Thread.currentThread().setContextClassLoader(classLoader);
// 尝试直接实例化
Core core = new Core();

注意:这种方法并非所有场景都生效,比如某些严格遵循双亲委派的类加载场景,但对于简单的直接实例化场景可以尝试。

另外,你之前尝试互相设置类加载器父级导致StackOverflowException,是因为类加载器的父委派关系是单向的,不能形成循环,这种做法本身就不符合类加载器的设计逻辑,建议放弃。

内容的提问来源于stack exchange,提问作者micartey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 11:47:34