• 获取包下的类名


    import java.io.File;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.ArrayList;
    import java.util.Enumeration;
    import java.util.List;
    import java.util.jar.JarEntry;
    import java.util.jar.JarFile;
    
    /**
     * @ClassName PackageUtil
     * @Description (获取包下的类名)
     * @author wwj
     * @Date 2017年5月3日 下午4:50:09
     * @version 1.0.0.0
     */
    public class PackageUtil { 
     
        public static void main(String[] args) throws Exception { 
            String packageName = "com.pf.task.slave.todo.download.bjwt.dao"; 
            List<String> classNames = getClassName(packageName, false); 
            if (classNames != null) { 
                for (String className : classNames) { 
                    System.out.println(className); 
                } 
            } 
        } 
     
        /**
         * 获取某包下(包括该包的所有子包)所有类
         * @param packageName 包名
         * @return 类的完整名称
         * @throws Exception 
         */ 
        public static List<String> getClassName(String packageName) throws Exception { 
            return getClassName(packageName, true); 
        } 
     
        /**
         * 获取某包下所有类
         * @param packageName 包名
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws Exception 
         */ 
        public static List<String> getClassName(String packageName, boolean childPackage) throws Exception { 
            List<String> fileNames = null; 
            ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
            String packagePath = packageName.replace(".", "/"); 
            URL url = loader.getResource(packagePath); 
            if (url != null) { 
                String type = url.getProtocol(); 
                if ("file".equals(type)) { 
                    fileNames = getClassNameByFile(url.getPath(), null, childPackage); 
                } else if (("jar").equals(type)) { 
                    fileNames = getClassNameByJar(url.getPath(), childPackage); 
                } 
            } else { 
                fileNames = getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, childPackage); 
            } 
            return fileNames; 
        } 
     
        /**
         * 从项目文件获取某包下所有类
         * @param filePath 文件路径
         * @param className 类名集合
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         */ 
        private static List<String> getClassNameByFile(String filePath, List<String> className, boolean childPackage) { 
            List<String> myClassName = new ArrayList<String>(); 
            File file = new File(filePath); 
            File[] childFiles = file.listFiles(); 
            for (File childFile : childFiles) { 
                if (childFile.isDirectory()) { 
                    if (childPackage) { 
                        myClassName.addAll(getClassNameByFile(childFile.getPath(), myClassName, childPackage)); 
                    } 
                } else { 
                    String childFilePath = childFile.getPath(); 
                    if (childFilePath.endsWith(".class")) { 
                        childFilePath = childFilePath.substring(childFilePath.indexOf("\classes") + 9, childFilePath.lastIndexOf(".")); 
                        childFilePath = childFilePath.replace("\", "."); 
                        myClassName.add(childFilePath); 
                    } 
                } 
            } 
     
            return myClassName; 
        } 
     
        /**
         * 从jar获取某包下所有类
         * @param jarPath jar文件路径
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws Exception 
         */ 
        private static List<String> getClassNameByJar(String jarPath, boolean childPackage) throws Exception { 
            List<String> myClassName = new ArrayList<String>(); 
            String[] jarInfo = jarPath.split("!"); 
            String jarFilePath = jarInfo[0].substring(jarInfo[0].indexOf("/")); 
            String packagePath = jarInfo[1].substring(1);
            JarFile jarFile = null;
            try { 
                jarFile = new JarFile(jarFilePath); 
                Enumeration<JarEntry> entrys = jarFile.entries(); 
                while (entrys.hasMoreElements()) { 
                    JarEntry jarEntry = entrys.nextElement(); 
                    String entryName = jarEntry.getName(); 
                    if (entryName.endsWith(".class")) { 
                        if (childPackage) { 
                            if (entryName.startsWith(packagePath)) { 
                                entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); 
                                myClassName.add(entryName); 
                            } 
                        } else { 
                            int index = entryName.lastIndexOf("/"); 
                            String myPackagePath; 
                            if (index != -1) { 
                                myPackagePath = entryName.substring(0, index); 
                            } else { 
                                myPackagePath = entryName; 
                            } 
                            if (myPackagePath.equals(packagePath)) { 
                                entryName = entryName.replace("/", ".").substring(0, entryName.lastIndexOf(".")); 
                                myClassName.add(entryName); 
                            } 
                        } 
                    } 
                } 
            } catch (Exception e) { 
                throw e; 
            }finally{
                if(null != jarFile){
                    jarFile.close();
                }
            } 
            return myClassName; 
        } 
     
        /**
         * 从所有jar中搜索该包,并获取该包下所有类
         * @param urls URL集合
         * @param packagePath 包路径
         * @param childPackage 是否遍历子包
         * @return 类的完整名称
         * @throws Exception 
         */ 
        private static List<String> getClassNameByJars(URL[] urls, String packagePath, boolean childPackage) throws Exception { 
            List<String> myClassName = new ArrayList<String>(); 
            if (urls != null) { 
                for (int i = 0; i < urls.length; i++) { 
                    URL url = urls[i]; 
                    String urlPath = url.getPath(); 
                    // 不必搜索classes文件夹 
                    if (urlPath.endsWith("classes/")) { 
                        continue; 
                    } 
                    String jarPath = urlPath + "!/" + packagePath; 
                    myClassName.addAll(getClassNameByJar(jarPath, childPackage)); 
                } 
            } 
            return myClassName; 
        } 
    } 
  • 相关阅读:
    13.Odoo产品分析 (二) – 商业板块(6) –采购(3)
    9.Odoo产品分析 (二) – 商业板块(4) –讨论(1)
    10.Odoo产品分析 (二) – 商业板块(5) –日历(1)
    8.Odoo产品分析 (二) – 商业板块(3) –CRM(2)
    7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
    the nearest point/vertex point of linestring
    Clojure的引用类型:var,ref,agent和atom
    clojure的delay future promise
    clojure的语法糖
    postgres select TOP X in group 查询每个组的前几名
  • 原文地址:https://www.cnblogs.com/sprinng/p/6802735.html
Copyright © 2020-2023  润新知