From 79914dabac38d83676ea16ff65da8d941a099285 Mon Sep 17 00:00:00 2001 From: Jay <csj123456> Date: 星期二, 08 十月 2024 10:38:01 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java | 128 ++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 128 insertions(+), 0 deletions(-) diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java new file mode 100644 index 0000000..d4831ad --- /dev/null +++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mpk/common/utils/DllUtils.java @@ -0,0 +1,128 @@ +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); + } + } +} -- Gitblit v1.9.3