java什么是包

2017-03-16

“包”(Packet)是TCP/IP协议通信传输中的数据单位,一般也称“数据包”。

包是用来分类管理类文件的,包相当于文件夹,类相当于文件。

java中的包:

[java] view plaincopypackage com.itkt.mtravel.hotel.util;

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;

public class PackageUtil {

public static void main(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 List getClassName(String packageName) {

return getClassName(packageName, true);

}

/**

* 获取某包下所有类

* @param packageName 包名

* @param childPackage 是否遍历子包

* @return 类的完整名称

*/

public static List getClassName(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);

}

return fileNames;

}

/**

* 从项目文件获取某包下所有类

* @param filePath 文件路径

* @param className 类名集合

* @param childPackage 是否遍历子包

* @return 类的完整名称

*/

private static List getClassNameByFile(String filePath, List className, boolean childPackage) {

List myClassName = new ArrayList();

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 类的完整名称

*/

private static List getClassNameByJar(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 = new JarFile(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();

}

return myClassName;

}

/**

* 从所有jar中搜索该包,并获取该包下所有类

* @param urls URL集合

* @param packagePath 包路径

* @param childPackage 是否遍历子包

* @return 类的完整名称

*/

private static List getClassNameByJars(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));

}

}

return myClassName;

}

}

更多相关阅读

最新发布的文章