Java 反射常用实践

动态加载类

获得一个 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);
    }
}
KAMI
KAMI
数据挖掘研究员,专注分享数据领域的技术和业务,以及逻辑、思维和方法论

发表回复

文章结构
相关文章