zoukankan      html  css  js  c++  java
  • 通过扫描包路径获取包内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);
                    }
                }
            }
        }
  • 相关阅读:
    hdu 4521 小明系列问题——小明序列(线段树 or DP)
    hdu 1115 Lifting the Stone
    hdu 5476 Explore Track of Point(2015上海网络赛)
    Codeforces 527C Glass Carving
    hdu 4414 Finding crosses
    LA 5135 Mining Your Own Business
    uva 11324 The Largest Clique
    hdu 4288 Coder
    PowerShell随笔3 ---别名
    PowerShell随笔2---初始命令
  • 原文地址:https://www.cnblogs.com/quyongjin/p/3907416.html
Copyright © 2011-2022 走看看