使用方式:
加载jar包: DynamicClassLoader.loadJar(“jar包绝对路径(D://test.jar)”)
从jar包中加载类: DynamicClassLoader.getClass(“jar包绝对路径”, “class文件路径(com.xxx.Test)”)
卸载jar包: DynamicClassLoader.unLoadJar(“jar包绝对路径”)
需注意:只能卸载使用DynamicClassLoader加载的jar包
import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class DynamicClassLoader {
private static final ClassLoader classLoader;
private static final Map<String, URLClassLoader> CLASS_LOADER_MAP = new ConcurrentHashMap<>();
static {
ClassLoader thisClassLoader = DynamicClassLoader.class.getClassLoader();
classLoader = thisClassLoader != null ? thisClassLoader : ClassLoader.getSystemClassLoader();
}
private DynamicClassLoader() {
}
public static boolean loadJar(String jarPath) {
try {
URL url = new File(jarPath).toURI().toURL();
URLClassLoader classLoader = CLASS_LOADER_MAP.remove(url.toString());
if (classLoader != null) {
classLoader.close();
}
classLoader = new URLClassLoader(new URL[]{url}, DynamicClassLoader.classLoader);
CLASS_LOADER_MAP.put(url.toString(), classLoader);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public static Class<?> getClass(String jarPath, String classPath) {
try {
URL url = new File(jarPath).toURI().toURL();
URLClassLoader classLoader = CLASS_LOADER_MAP.get(url.toString());
return classLoader.loadClass(classPath);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static boolean unLoadJar(String jarPath) {
try {
URL url = new File(jarPath).toURI().toURL();
URLClassLoader classLoader = CLASS_LOADER_MAP.remove(url.toString());
if (classLoader != null) {
classLoader.close();
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}