| 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<String> searchClassFromUrl(URI[] uris, String rootPackage){ | 
|         List<String> 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<String> searchClassFromArchive(JarFile file) { | 
|         List<String> classNames = new ArrayList<>() ; | 
|         for (Enumeration<JarEntry> 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<String> 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); | 
|             } | 
|         } | 
|     } | 
|   | 
| } |