package com.iailab.module.model.mpk.common.utils;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import sun.misc.URLClassPath;
|
|
import java.io.File;
|
import java.lang.reflect.Field;
|
import java.lang.reflect.Method;
|
import java.net.URL;
|
import java.net.URLClassLoader;
|
import java.util.Iterator;
|
import java.util.Vector;
|
|
@Slf4j
|
public class DllUtils {
|
|
/**
|
* @description: 加载dll到指定class下
|
* @author: dzd
|
* @date: 2024/9/30 14:27
|
**/
|
public static void loadDll(Class<?> clazz, String dllPath) {
|
try {
|
Method method = Runtime.class.getDeclaredMethod("load0", Class.class,String.class);
|
boolean accessible = method.isAccessible();
|
method.setAccessible(true);
|
method.invoke(Runtime.getRuntime(), clazz,dllPath);
|
method.setAccessible(accessible);
|
log.info("成功加载dll:"+ dllPath);
|
} catch (Exception e) {
|
throw new RuntimeException("加载dll异常",e);
|
}
|
}
|
|
/**
|
* @description: 卸载classLoader下全部dll
|
* @author: dzd
|
* @date: 2024/9/30 14:31
|
**/
|
public static synchronized void uploadDll(URLClassLoader classLoader) {
|
try {
|
Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
|
field.setAccessible(true);
|
Vector<Object> libs = (Vector<Object>) field.get(classLoader);
|
Iterator<Object> it = libs.iterator();
|
Object o;
|
while (it.hasNext()) {
|
o = it.next();
|
Method method = o.getClass().getDeclaredMethod("finalize");
|
boolean accessible = method.isAccessible();
|
method.setAccessible(true);
|
method.invoke(o);
|
method.setAccessible(accessible);
|
|
Field nameDield = o.getClass().getDeclaredField("name");
|
nameDield.setAccessible(true);
|
String name = (String) nameDield.get(o);
|
|
log.info("成功卸载dll:" + name);
|
}
|
} catch (Exception e) {
|
throw new RuntimeException("卸载dll异常",e);
|
}
|
}
|
|
/**
|
* @description: 从classLoader中卸载dll,如果dllName传null,则默认删除全部dll
|
* @author: dzd
|
* @date: 2024/9/30 14:52
|
**/
|
public static synchronized void uploadDllName(URLClassLoader classLoader,String dllName) {
|
try {
|
Field field = ClassLoader.class.getDeclaredField("nativeLibraries");
|
field.setAccessible(true);
|
Vector<Object> libs = (Vector<Object>) field.get(classLoader);
|
Iterator<Object> it = libs.iterator();
|
Object o;
|
while (it.hasNext()) {
|
o = it.next();
|
Field nameDield = o.getClass().getDeclaredField("name");
|
nameDield.setAccessible(true);
|
String name = (String) nameDield.get(o);
|
// dllName不为null 并且 不等于name,跳出(dllName为null默认全部删除)
|
if (StringUtils.isNotEmpty(dllName) && !dllName.equals(name)) {
|
return;
|
}
|
Method method = o.getClass().getDeclaredMethod("finalize");
|
boolean accessible = method.isAccessible();
|
method.setAccessible(true);
|
method.invoke(o);
|
method.setAccessible(accessible);
|
log.info("成功卸载dll:" + name);
|
}
|
} catch (Exception e) {
|
throw new RuntimeException("卸载dll异常",e);
|
}
|
}
|
|
/**
|
* @description: 加载jar到特定的URLClassLoader,并返回URLClassLoader
|
* @author: dzd
|
* @date: 2024/9/30 14:20
|
**/
|
public static synchronized URLClassLoader loadJar(String jarPath) {
|
File jarFile = new File(jarPath);
|
if (!jarFile.exists()) {
|
throw new RuntimeException("jar沒有找到!");
|
} else {
|
try {
|
URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()});
|
log.info("成功加载jar包:"+ jarFile.getAbsolutePath());
|
return urlClassLoader;
|
} catch (Exception e) {
|
throw new RuntimeException("加载jar异常",e);
|
}
|
}
|
}
|
|
public static synchronized void uploadJar(URLClassLoader urlClassLoader) {
|
try {
|
urlClassLoader.close();
|
log.info("成功卸载jar包。");
|
} catch (Exception e) {
|
throw new RuntimeException("卸载jar异常",e);
|
}
|
}
|
}
|