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;/**
* 获取包中所有的类
* @author
**/
public classPackageUtil {public static voidmain(String[] args) throws Exception {
String packageName= "com.wang.vo.request.hotel";//List classNames = getClassName(packageName);
List classNames = getClassName(packageName, false);if (classNames != null) {for(String className : classNames) {
System.out.println(className);
}
}
}/**
* 获取某包下(包括该包的所有子包)所有类
*
* @param packageName
* 包名
* @return 类的完整名称*/
public static ListgetClassName(String packageName) {return getClassName(packageName, true);
}/**
* 获取某包下所有类
*
* @param packageName
* 包名
* @param childPackage
* 是否遍历子包
* @return 类的完整名称*/
public static ListgetClassName(String packageName, boolean childPackage) {
List fileNames = null;
ClassLoader loader=Thread.currentThread().getContextClassLoader();
String packagePath= packageName.replace(".", "/");
URL url=loader.getResource(packagePath);if (url != null) {
String type=url.getProtocol();if (type.equals("file")) {
fileNames= getClassNameByFile(url.getPath(), null, childPackage);
}else if (type.equals("jar")) {
fileNames=getClassNameByJar(url.getPath(), childPackage);
}
}else{
fileNames=getClassNameByJars(((URLClassLoader) loader).getURLs(), packagePath, childPackage);
}returnfileNames;
}/**
* 从项目文件获取某包下所有类
*
* @param filePath
* 文件路径
* @param className
* 类名集合
* @param childPackage
* 是否遍历子包
* @return 类的完整名称*/
private static List getClassNameByFile(String filePath, ListclassName, boolean childPackage) {
List myClassName = new ArrayList<>();
File file= newFile(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);
}
}
}returnmyClassName;
}/**
* 从jar获取某包下所有类
*
* @param jarPath
* jar文件路径
* @param childPackage
* 是否遍历子包
* @return 类的完整名称*/
private static ListgetClassNameByJar(String jarPath, boolean childPackage) {
List myClassName = new ArrayList<>();
String[] jarInfo= jarPath.split("!");
String jarFilePath= jarInfo[0].substring(jarInfo[0].indexOf("/"));
String packagePath= jarInfo[1].substring(1);try{
JarFile jarFile= newJarFile(jarFilePath);
Enumeration 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) {
e.printStackTrace();
}returnmyClassName;
}/**
* 从所有jar中搜索该包,并获取该包下所有类
*
* @param urls
* URL集合
* @param packagePath
* 包路径
* @param childPackage
* 是否遍历子包
* @return 类的完整名称*/
private static ListgetClassNameByJars(URL[] urls, String packagePath, boolean childPackage) {
List myClassName = new ArrayList<>();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));
}
}returnmyClassName;
}
}