Java动态扩展需类加载器与反射协同:自定义类加载器(如继承URLClassLoader)负责动态加载新类,反射通过接口调用其方法;需统一接口、目录监控、类隔离及安全校验。
Java 类加载器和反射机制配合,能实现在程序运行中动态加载新类、调用新功能,无需重启服务。核心在于:类加载器负责把字节码“放进 JVM”,反射负责“认识并使用它”。两者协同,才能真正完成扩展。
默认的系统类加载器(System ClassLoader)只加载启动时 classpath 下的类,运行中新增的 class 文件它不会自动发现。所以必须自定义一个类加载器,让它能监控指定目录、读取新 .class 文件,并生成对应的 Class 对象。
URLClassLoader 或直接实现 ClassLoader,重写 findClass() 方法defineClass() 把字节数组转为 JVM 可识别的 Class 实例loadClass() 跳过父加载器光有 Class 对象还不够,得通过反射创建实例、调用方法。前提是新类必须实现某个已知接口(比如 Extension),否则编译期无法约定行为。
Class.forName(className, true, customLoader) 触发加载并初始化clazz.getDeclaredConstructor().newInstance() 创建对象getMethod("execute").invoke(instance) 执行业务逻辑setAccessible(true)
真实场景中,不能靠手动丢 class 文件再敲命令。需要一套轻量闭环机制:
立即学习“Java免费学习笔记(深入)”;
public interface Plugin { void run(); })plugins/)的文件变化,用 WatchService 捕获新增 .class反复加载同一类名的不同版本,容易引发 LinkageError 或内存泄漏——旧 Class 对象及其静态资源可能无法回收。
Runtime.exec)