首页 > 代码库 > 通过扫描包路径获取包内class

通过扫描包路径获取包内class

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);                }            }        }    }