package com.lms.db.driver;
import java.io.File;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 使用URLClassLoader加载
* @author: pp_lan
* @date: 2022/3/17
*/
public class UrlExternalClasspathLoader {
private final URLClassLoader urlClassLoader;
/**
* 构造方法
* @param file jar所在的路径,或者单个jar的全路径
*/
public UrlExternalClasspathLoader(File file,ClassLoader parent) throws Exception {
List<URL> urlList = new ArrayList<>();
if (file.isDirectory()) {
addUrl(urlList, file);
} else {
addJar(urlList, file);
}
URL[] urls = urlList.toArray(new URL[]{});
urlClassLoader = new URLClassLoader(urls,parent);
}
public UrlExternalClasspathLoader(File file) throws Exception {
List<URL> urlList = new ArrayList<>();
if (file.isDirectory()) {
addUrl(urlList, file);
} else {
addJar(urlList, file);
}
URL[] urls = urlList.toArray(new URL[]{});
urlClassLoader = new URLClassLoader(urls);
}
public void init() {
}
/**
* 加载class
* @param name
* @return
* @throws ClassNotFoundException
*/
public Class<?> loadClass(String name) throws ClassNotFoundException {
return this.urlClassLoader.loadClass(name);
}
/**
* 加载路径
* @param urlList
* @param file
*/
private void addUrl(List<URL> urlList, File file) throws Exception {
File[] subFiles = file.listFiles();
if (subFiles != null) {
for (File subFile : subFiles) {
if (subFile.isDirectory()) {
addUrl(urlList, subFile);
} else {
addJar(urlList, subFile);
}
}
}
}
/**
* 加载jar
* @param urlList
* @param subFile
*/
private void addJar(List<URL> urlList, File subFile) throws Exception {
try {
if (subFile.getAbsolutePath().endsWith(".jar")) {
urlList.add(subFile.toURI().toURL());
}
} catch (MalformedURLException e) {
throw new Exception("加载JAR异常");
}
}
public static void main(String[] args) throws Exception {
System.out.println("开始");
UrlExternalClasspathLoader classLoader1 = new UrlExternalClasspathLoader(new File("D:\\idea_workspace\\1-tool\\db-driver-manager\\src\\main\\resources\\driver\\dm\\Dm7JdbcDriver.jar"),null);
UrlExternalClasspathLoader classLoader2 = new UrlExternalClasspathLoader(new File("D:\\idea_workspace\\1-tool\\db-driver-manager\\src\\main\\resources\\driver\\dm\\DmJdbcDriver.jar"),null);
try {
Class<?> aClass1 = classLoader1.loadClass("dm.jdbc.driver.DmDriver");
Object o = aClass1.newInstance();
System.out.println(o);
Class<?> aClass2 = classLoader2.loadClass("dm.jdbc.driver.DmDriver");
Object o2 = aClass2.newInstance();
System.out.println(o2);
} catch (Exception e) {
e.printStackTrace();
}
}
}