package com.fastbee.base.util; import java.io.File; import java.lang.annotation.Annotation; import java.net.JarURLConnection; import java.net.URL; import java.util.Enumeration; import java.util.LinkedList; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * 类操作工具 * @author bill */ public class ClassUtils { public static List getClassList(String packageName, Class annotationClass) { List classList = getClassList(packageName); classList.removeIf(next -> !next.isAnnotationPresent(annotationClass)); return classList; } public static List getClassList(String packageName) { List classList = new LinkedList<>(); String path = packageName.replace(".", "/"); try { Enumeration urls = ClassUtils.getClassLoader().getResources(path); while (urls.hasMoreElements()) { URL url = urls.nextElement(); if (url != null) { String protocol = url.getProtocol(); if (protocol.equals("file")) { addClass(classList, url.toURI().getPath(), packageName); } else if (protocol.equals("jar")) { JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection(); JarFile jarFile = jarURLConnection.getJarFile(); Enumeration jarEntries = jarFile.entries(); while (jarEntries.hasMoreElements()) { JarEntry jarEntry = jarEntries.nextElement(); String entryName = jarEntry.getName(); if (entryName.startsWith(path) && entryName.endsWith(".class")) { String className = entryName.substring(0, entryName.lastIndexOf(".")).replaceAll("/", "."); addClass(classList, className); } } } } } } catch (Exception e) { throw new RuntimeException("Initial class error!"); } return classList; } private static void addClass(List classList, String packagePath, String packageName) { try { File[] files = new File(packagePath).listFiles(file -> (file.isDirectory() || file.getName().endsWith(".class"))); if (files != null) for (File file : files) { String fileName = file.getName(); if (file.isFile()) { String className = fileName.substring(0, fileName.lastIndexOf(".")); if (packageName != null) { className = packageName + "." + className; } addClass(classList, className); } else { String subPackagePath = fileName; if (packageName != null) { subPackagePath = packagePath + "/" + subPackagePath; } String subPackageName = fileName; if (packageName != null) { subPackageName = packageName + "." + subPackageName; } addClass(classList, subPackagePath, subPackageName); } } } catch (Exception e) { throw new RuntimeException(e); } } private static void addClass(List classList, String className) { classList.add(loadClass(className, false)); } public static Class loadClass(String className, boolean isInitialized) { try { return Class.forName(className, isInitialized, getClassLoader()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } public static ClassLoader getClassLoader() { return Thread.currentThread().getContextClassLoader(); } }