獲取包下的類名


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM