项目中要使用热加载,所以写了一个工具类,用于扫描指定路径下的jar包中的所有类;
代码如下:
@Slf4j
public class JarUtils {
private static final String CLASS_SUFFIX = ".class";
public Set<Class<?>> loadAllClass(String jarPath) throws IOException, ClassNotFoundException {
Set<Class<?>> classSet = new HashSet<>(16);
URL url = new URL(jarPath);
URLClassLoader classLoader = new URLClassLoader(new URL[]{url}, getClass().getClassLoader());
JarFile jarFile = new JarFile(jarPath);
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry jarEntry = entries.nextElement();
String jarName = jarEntry.getName();
System.out.println(jarName);
if (!jarEntry.isDirectory() && jarName.endsWith(CLASS_SUFFIX)) {
// 将文件路径名转换为包名称的形式
String className = jarName.replace(CLASS_SUFFIX, "");
className = ClassUtils.convertResourcePathToClassName(className);
Class<?> aClass = classLoader.loadClass(className);
classSet.add(aClass);
}
}
return classSet;
}
public Set<Class<?>> getClassByParent(String jarPath, Class<?> superClass) {
Set<Class<?>> classSet;
try {
classSet = loadAllClass(jarPath);
} catch (ClassNotFoundException e) {
log.error("- can not find class", e);
throw new RuntimeException("ClassNotFoundException");
} catch (IOException e2) {
log.error("- read jar error", e2);
throw new RuntimeException("read jar error");
}
return classSet.stream()
.filter(superClass::isAssignableFrom)
.collect(Collectors.toSet());
}
}
网友评论