package com.dy.common.util; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URI; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.Logger; @SuppressWarnings("unused") public class ClassScan { private static final Logger logger = Logger.getLogger(ClassScan.class.getName()); /** * 在指定的URL路径中搜索Class * * @param uris 要搜索的java文件URI,不能用URL类型,因为URL路径中有中文将失败 * @param rootPackage 要搜索的java文件的包路径 */ public List searchClassFromUrl(URI[] uris, String rootPackage){ List classNames = new ArrayList<>() ; for (URI uri : uris) { try { File file = new File(uri.getPath()); if (!file.exists()){ throw new FileNotFoundException(); } this.doSearchClass(file, rootPackage ,classNames); } catch (Exception ex) { logger.throwing(ClassScan.class.getName(), "searchClassFromUrl", ex); } } return classNames ; } /** * 在指定的jar文件中搜索Class * @param file 要搜索的jar文件 */ public List searchClassFromArchive(JarFile file) { List classNames = new ArrayList<>() ; for (Enumeration enumeration = file.entries(); enumeration.hasMoreElements();) { JarEntry entry = enumeration.nextElement(); if (entry.getName().endsWith(".class")) { classNames.add(file.getName()) ; } } return classNames ; } /** * 搜索指定文件夹下层级里的class * @param dir 文件夹 * @param rootPackage 根包 * @param classNames 类名称集合 */ private void doSearchClass(File dir, String rootPackage, List classNames) { String path ; if (dir.isDirectory()) { File[] fs = dir.listFiles() ; if(fs != null && fs.length > 0){ for (File f : fs){ //只搜当前文件夹中文件 this.doSearchClass(f, rootPackage, classNames); } } return; } if (dir.getName().endsWith(".class")) { path = dir.getAbsolutePath() ; path = path.replace('/', '.') ; path = path.replace('\\', '.') ; path = path.substring(path.indexOf(rootPackage)) ; classNames.add(path) ; } else if (dir.getName().endsWith(".zip") || dir.getName().endsWith(".jar")) { try { this.searchClassFromArchive(new JarFile(dir)); } catch (IOException ex) { logger.throwing(ClassScan.class.getName(), "doSearchClass", ex); } } } }