总结:遍历路径下的文件的方法

一、读取包路径下面的所有class文件
private Set<Class<?>> getPackageAllClasses(String basePackage, boolean recursive) {
if (StringUtils.isEmpty(basePackage))
return new HashSet<Class<?>>();
Set<Class<?>> classes = new LinkedHashSet

}
二、以jar的方式扫描包下的所有class文件
private void scanPackageClassesByJar(String basePackage, URL url, final boolean recursive, Set<Class<?>> classes) {
String package2Path = basePackage.replace(’.’, ‘/’);
JarFile jar;
try {
jar = ((JarURLConnection) url.openConnection()).getJarFile();
Enumeration entries = jar.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
String name = entry.getName();
if (!name.startsWith(package2Path) || entry.isDirectory()) {
continue;
}
// 判断是否递归搜索子包
if (!recursive && name.lastIndexOf(’/’) != package2Path.length()) {
continue;
}
// 判断是否过滤 inner class
if (this.excludeInner && name.indexOf(’$’) != -1) {
log.debug(“exclude inner class with name:” + name);
continue;
}
String classSimpleName = name.substring(name.lastIndexOf(’/’) + 1);
// 判定是否符合过滤条件
if (this.filterClassName(classSimpleName)) {
String className = name.replace(’/’, ‘.’);
className = className.substring(0, className.length() - 6);
try {
classes.add(Thread.currentThread().getContextClassLoader().loadClass(className));
} catch (ClassNotFoundException e) {
log.error(“classpath” + url.getPath() + " , class " + className, e);
} catch (NoClassDefFoundError error) {
log.error(“loadclass error” + url.getPath() + " , class" + className, error);
}
}
}
} catch (IOException e) {
log.error(“IOException error:URL is ===>” + url.getPath(), e);
} catch (Throwable e) {
log.error(“ScanPackageClassesByJar error:URL is ===>” + url.getPath(), e);
}
}
三、以文件的方式扫描包下的所有class文件
private void scanPackageClassesByFile(
Set<Class<?>> classes, String packageName, String packagePath, final boolean recursive) {
File dir = new File(packagePath);
if (!dir.exists() || !dir.isDirectory()) {
return;
}
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return filterClassFileByCustomization(pathname, recursive);
}
});
if (null == files || files.length == 0) {
return;
}
for (File file : files) {
if (file.isDirectory()) {
doScanPackageClassesByFile(classes, packageName + “.” + file.getName(), file.getAbsolutePath(), recursive);
} else {
String className = file.getName().substring(0,
file.getName().length() - CLASS_EXTENSION_NAME.length());
try {
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + ‘.’ + className));
} catch (ClassNotFoundException e) {
log.error(“LoadClass exception: ===>” + className, e);
} catch (NoClassDefFoundError error) {
log.error(“LoadClass error: ===>” + className, error);
}
}
}
}
四、根据规则过滤类文件
private boolean filterClassName(String className) {
if (!className.endsWith(CLASS_EXTENSION_NAME)) {
return false;
}
if (null == this.classFilters || this.classFilters.isEmpty()) {
return true;
}
String tmpName = className.substring(0, className.length() - 6);
boolean flag = false;
for (String str : classFilters) {
flag = matchInnerClassname(tmpName, str);
if (flag) break;
}
return (checkInOrEx && flag) || (!checkInOrEx && !flag);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值