diff --git a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java index 88afd1e93..1bebcff5f 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/network/server/ProtocolsManager.java @@ -502,6 +502,7 @@ public class ProtocolsManager implements ProtocolsAbstract { try { ClassLoaderHelper.findLocalClass(pck, BaseHandler.class, classLoader, handlers); + ClassLoaderHelper.findClassJar(pck, BaseHandler.class, classLoader, handlers); handlers.forEach(hand -> { BaseHandler baseHandler = null; diff --git a/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java index 08fce7c67..3d63c7198 100644 --- a/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java +++ b/serverlogic/src/main/java/com/ljsd/jieling/util/ClassLoaderHelper.java @@ -1,10 +1,16 @@ package com.ljsd.jieling.util; import java.io.File; +import java.io.IOException; import java.lang.reflect.Modifier; +import java.net.JarURLConnection; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; +import java.util.Enumeration; import java.util.List; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; /** * Description: des @@ -77,4 +83,68 @@ public class ClassLoaderHelper { return filterclass.isAssignableFrom(clazz); } + + /** + * jar包查找 + */ + public static void findClassJar(final String packName, Class classinterface, ClassLoader classLoader, List> classes) + { + String pathName = packName.replace(".", "/"); + JarFile jarFile; + try + { + URL url = classLoader.getResource(pathName); + JarURLConnection jarURLConnection = (JarURLConnection)url.openConnection(); + jarFile = jarURLConnection.getJarFile(); + } + catch(IOException |NullPointerException e) + { + return; + } + + Enumeration jarEntries = jarFile.entries(); + while(jarEntries.hasMoreElements()) + { + JarEntry jarEntry = jarEntries.nextElement(); + String jarEntryName = jarEntry.getName(); + if(jarEntryName.contains(pathName) && !jarEntryName.equals(pathName + "/")) + { + if(jarEntry.isDirectory()) + { + String clazzName = jarEntry.getName().replace("/", "."); + int endIndex = clazzName.lastIndexOf("."); + String prefix = null; + if(endIndex > 0) + { + prefix = clazzName.substring(0, endIndex); + } + findClassJar(prefix, classinterface,classLoader,classes); + } + if(jarEntry.getName().endsWith(".class")) + { + Class clazz = null; + try + { + clazz = classLoader.loadClass(jarEntry.getName().replace("/", ".").replace(".class", "")); + } + catch(ClassNotFoundException e) + { + e.printStackTrace(); + } + if(clazz == null) + { + return; + } + if(filter(clazz, classinterface)) + { + classes.add(clazz); + } + } + } + + } + + } + + }