import java.io.File;
import java.io.IOException;
import java.net.*;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class ClassUtil {
/**
* @param jarPath jar包物理路径
* @param packageName 包名
*/
public static Map<String, Class<?>> getClasses(String jarPath, String packageName) {
Map<String, Class<?>> classes = new HashMap<>(16);
// 获取包的名字 并进行替换
String packageDirName = packageName.replace('.', '/');
final Enumeration<URL> dirs;
try {
URL jarUrl = new File(jarPath).toURI().toURL();
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{jarUrl});
dirs = classLoader.getResources(packageDirName);
while (dirs.hasMoreElements()) {
URL url = dirs.nextElement();
classes.putAll(findClassInJar(packageName, url, classLoader));
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
private static Map<String, Class<?>> findClassInJar(String packageName, URL url, ClassLoader classLoader) {
Map<String, Class<?>> classes = new HashMap<>(16);
String packageDirName = packageName.replace('.', '/');
JarFile jar;
try {
// 获取jar
jar = ((JarURLConnection) url.openConnection()).getJarFile();
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
JarEntry entry = entries.nextElement();
if (entry.isDirectory()) {
continue;
}
String name = entry.getName();
if (name.charAt(0) == '/') {
// 获取后面的字符串
name = name.substring(1);
}
// 如果前半部分和定义的包名相同
if (name.startsWith(packageDirName) && name.endsWith(".class")) {
// 去掉后面的".class"
String className = name.substring(0, name.length() - 6).replace('/', '.');
try {
// 添加到classes
classes.put(className, classLoader.loadClass(className));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
}
记录如何从外部jar包中加载指定包下面的所有class对象
最新推荐文章于 2024-07-26 12:28:02 发布