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