public static Set<Class<?>> getClasses(ClassLoader classLoader, String pack) { Set<Class<?>> classes = new LinkedHashSet<Class<?>>(); boolean recursive = true; String packageName = pack; // 包路径分隔符 . 换为 / String packageDirName = packageName.replace(‘.‘, ‘/‘); try { Enumeration<URL> dirs; if (classLoader == null) { dirs = Thread.currentThread().getContextClassLoader() .getResources(packageDirName); } else { dirs = classLoader.getResources(packageDirName); } while (dirs.hasMoreElements()) { URL url = (URL) dirs.nextElement(); String protocol = url.getProtocol(); if ("file".equals(protocol)) { String filePath = URLDecoder.decode(url.getFile(), "UTF-8"); findAndAddClassesInPackageByFile(packageName, filePath,recursive, classes); } else if ("jar".equals(protocol)) { try { JarFile jar = ((JarURLConnection) url.openConnection()) .getJarFile(); Enumeration<JarEntry> entries = jar.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); String name = entry.getName(); if (name.charAt(0) == ‘/‘) { name = name.substring(1); } if (name.startsWith(packageDirName)) { int idx = name.lastIndexOf("/"); if (idx != -1) { packageName = name.substring(0, idx).replace(‘/‘, ‘.‘); } if (((idx != -1) || (recursive)) && (name.endsWith(".class")) && (!entry.isDirectory())) { String className = name.substring(packageName.length() + 1,name.length() - 6); try { classes.add(Thread.currentThread().getContextClassLoader().loadClass( packageName + "." + className)); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } } } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } } catch (Exception ex) { log.error(ex.getMessage(), ex); } return classes; }
public static void findAndAddClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, Set<Class<?>> classes) { File dir = new File(packagePath); if ((!dir.exists()) || (!dir.isDirectory())) { return; } File[] dirFiles = dir.listFiles(new FileFilter() { public boolean accept(File file) { return (recursive && (file.isDirectory())) || (file.getName().endsWith(".class")); } }); for (File file : dirFiles) { if (file.isDirectory()) { findAndAddClassesInPackageByFile(packageName + "." + file.getName(),file.getAbsolutePath(), recursive, classes); } else { String className = file.getName().substring(0,file.getName().length() - 6); try { classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + "." + className)); } catch (Exception ex) { log.error(ex.getMessage(), ex); } } } }
通过扫描包路径获取包内class
时间: 2024-11-08 21:40:07