最直接有效的测试方式是验证自定义类加载器成功加载类且getClassLoader()返回其自身实例;通过-XX:+TraceClassLoading日志确认加载来源;加载同名类验证双亲委派是否被打破;最后实例化并调用方法确保功能正常。

最直接有效的测试方式,是让自定义类加载器成功加载一个类,并验证该类的 ClassLoader 实例确实是你的类加载器,而非系统默认的 AppClassLoader 或 BootstrapClassLoader。
确认类由自定义加载器加载
在加载完成后,调用目标 Class 对象的 getClassLoader() 方法,打印或断言其类型:
- 如果返回的是你写的类(如
MyClassLoader的实例),说明加载生效 - 如果返回
jdk.internal.loader.ClassLoaders$AppClassLoader或null(Bootstrap),说明双亲委派未被绕过,你的加载器没起作用
示例代码片段:
Class> clazz = myClassLoader.loadClass("org.xhs.util.TetsClass");System.out.println("加载器:" + clazz.getClassLoader()); // 应输出 MyClassLoader 实例
观察 JVM 类加载日志
启动 JVM 时添加参数,让加载行为“可见”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
-XX:+TraceClassLoading:查看每个类由哪个加载器加载,搜索你的类名和类加载器类名(如MyClassLoader) -
-XX:+TraceClassUnloading(配合 GC):验证后续是否能卸载,间接证明是你加载的(系统类通常不卸载)
日志中出现类似 [Loaded org.xhs.util.TetsClass by com.demo01.servlet.MyClassLoader] 即为生效证据。
验证类隔离与打破双亲委派
写一个与 JDK 或应用中同名的类(如 java.lang.String 的简化版),放在磁盘指定路径,用你的加载器加载:
- 若能成功加载且不抛
SecurityException(需去掉defineClass的包限制或使用自定义包名),说明已脱离双亲委派约束 - 若报
java.lang.SecurityException: Prohibited package name: java.lang,说明仍受保护——此时应改用非java.*包(如mylang.String)再试
检查类能否正常实例化和调用
仅加载成功还不够,要验证功能可用性:
- 用
clazz.getDeclaredConstructor().newInstance()创建实例 - 反射调用其方法(如
TetsClass的构造函数是否触发打印) - 若控制台输出预期日志(如 “TetsClass 初始化成功”),说明字节码正确、链接与初始化阶段也通过

















