动态加载类
获得一个 ClassLoader
并调用其 loadClass()
方法:
public class MainClass {
public static void main(String[] args){
ClassLoader classLoader = MainClass.class.getClassLoader();
try {
Class aClass = classLoader.loadClass("com.jenkov.MyClass");
System.out.println("aClass.getName() = " + aClass.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
动态加载 Jar
通过 URLClassLoader 加载器加载
public static void loadJar(String jarPath) throws Exception {
// 指定Jar包存放的路径
File files = new File(jarPath);
// 找到所有以 .jar 结尾的文件
File[] fileArray = files.listFiles(f -> f.getName().endsWith(".jar"));
// 获得类加载器相关方法对象(URLClassLoader:支持从jar包或者文件夹等路径链接中获取class)
Method method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
URLClassLoader classLoader = null;
try {
// 获取方法的访问权限
method.setAccessible(true);
classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();
for (File file : fileArray) {
// 将当前类路径加到类加载器中
method.invoke(classLoader, file.toURI().toURL());
}
} finally {
method.setAccessible(false);
}
}