From 154b38709aa8151222382240392f120ae5542a69 Mon Sep 17 00:00:00 2001
From: Jay <csj123456>
Date: 星期二, 18 二月 2025 15:29:05 +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 |   49 ++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 42 insertions(+), 7 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
index 947da19..8151cc7 100644
--- 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
@@ -12,14 +12,15 @@
 import java.lang.reflect.Method;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Vector;
+import java.util.*;
+import java.util.stream.Collectors;
 
 @Slf4j
 public class DllUtils {
 
     private static HashMap<String, URLClassLoader> classLoaderCache = new HashMap<>();
+    private static HashMap<String, Object> classCache = new HashMap<>();
+    private static HashMap<String, Method> classMethodCache = new HashMap<>();
 
     /**
      * @description: 加载dll到指定class下
@@ -147,6 +148,27 @@
             unloadDll(urlClassLoader);
             unloadJar(urlClassLoader);
             classLoaderCache.remove(projectId);
+            removeClassCache(projectId);
+            removeClassMethodCache(projectId);
+        }
+    }
+    public static synchronized void removeClassCache(String projectId) {
+        Iterator<String> iterator = classCache.keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            if (key.startsWith(projectId)) {
+                iterator.remove();
+            }
+        }
+    }
+
+    public static synchronized void removeClassMethodCache(String projectId) {
+        Iterator<String> iterator = classMethodCache.keySet().iterator();
+        while (iterator.hasNext()) {
+            String key = iterator.next();
+            if (key.startsWith(projectId)) {
+                iterator.remove();
+            }
         }
     }
 
@@ -216,10 +238,23 @@
         } else if (model == null) {
             throw new RuntimeException("模型文件不能为空!");
         } else {
-            URLClassLoader classLoader = DllUtils.getClassLoader(projectId);
-            Class<?> clazz = classLoader.loadClass(model.getClassName());
-            Method method = clazz.getMethod(model.getMethodName(), model.getParamsArray());
-            return (HashMap)method.invoke(clazz.newInstance(), paramsValueArray);
+            String classCacheKey = projectId + "_" + model.getClassName();
+            String methodParams = Arrays.stream(model.getParamsArray()).map(e -> e.getName()).collect(Collectors.joining(","));
+            String classMethodCacheKey = classCacheKey + "." + model.getMethodName() + "(" + methodParams + ")";
+            if (classCache.containsKey(classCacheKey) && classMethodCache.containsKey(classMethodCacheKey)) {
+                return (HashMap)classMethodCache.get(classMethodCacheKey).invoke( classCache.get(classCacheKey), paramsValueArray);
+            }else {
+                URLClassLoader classLoader = DllUtils.getClassLoader(projectId);
+                if (null == classLoader) {
+                    throw new RuntimeException("dll未发布,classLoader为null");
+                }
+                Class<?> clazz = classLoader.loadClass(model.getClassName());
+                Object o = clazz.newInstance();
+                Method method = clazz.getMethod(model.getMethodName(), model.getParamsArray());
+                classCache.put(classCacheKey,o);
+                classMethodCache.put(classMethodCacheKey,method);
+                return (HashMap)method.invoke(o, paramsValueArray);
+            }
         }
     }
 }

--
Gitblit v1.9.3