ClassScanner 增加忽略加载错误类的扫描方法

This commit is contained in:
Looly 2022-11-08 19:20:09 +08:00
parent 39dee801f0
commit d298eb5b73
3 changed files with 19 additions and 19 deletions

View File

@ -10,6 +10,7 @@
* 【core 】 FileUtil.copy当来源为文件时返回文件而非目录issue#I5YCVL@Gitee * 【core 】 FileUtil.copy当来源为文件时返回文件而非目录issue#I5YCVL@Gitee
* 【db 】 DialectFactory增加identifyDriver重载issue#I5YWI6@Gitee * 【db 】 DialectFactory增加identifyDriver重载issue#I5YWI6@Gitee
* 【core 】 去除ClassloaderUtil的Cacheissue#I5YWI6@Gitee * 【core 】 去除ClassloaderUtil的Cacheissue#I5YWI6@Gitee
* 【core 】 ClassScanner 增加忽略加载错误类的扫描方法pr#855@Gitee
### 🐞Bug修复 ### 🐞Bug修复
* 【db 】 修复分页时order by截断问题issue#I5X6FM@Gitee * 【db 】 修复分页时order by截断问题issue#I5X6FM@Gitee

View File

@ -221,6 +221,17 @@ public class ClassScanner implements Serializable {
this.charset = charset; this.charset = charset;
} }
/**
* 设置是否忽略loadClass时的错误
*
* @param ignoreLoadError 忽略loadClass时的错误
* @return this
*/
public ClassScanner setIgnoreLoadError(boolean ignoreLoadError) {
this.ignoreLoadError = ignoreLoadError;
return this;
}
/** /**
* 扫描包路径下满足class过滤器条件的所有class文件<br> * 扫描包路径下满足class过滤器条件的所有class文件<br>
* 此方法首先扫描指定包名下的资源目录如果未扫描到则扫描整个classpath中所有加载的类 * 此方法首先扫描指定包名下的资源目录如果未扫描到则扫描整个classpath中所有加载的类
@ -231,19 +242,6 @@ public class ClassScanner implements Serializable {
return scan(false); return scan(false);
} }
/**
* 扫描
*
* @param forceScanJavaClassPaths 是否强制扫描其他位于classpath关联jar中的类
* @param ignoreLoadError 是否或略扫描时loadClass的异常
* @return 类集合
*
*/
public Set<Class<?>> scan(boolean forceScanJavaClassPaths,boolean ignoreLoadError){
this.ignoreLoadError = ignoreLoadError;
return scan(forceScanJavaClassPaths);
}
/** /**
* 扫描包路径下满足class过滤器条件的所有class文件 * 扫描包路径下满足class过滤器条件的所有class文件
* *
@ -298,7 +296,7 @@ public class ClassScanner implements Serializable {
/** /**
* 忽略加载错误扫描后可以获得之前扫描时加载错误的类名字集合 * 忽略加载错误扫描后可以获得之前扫描时加载错误的类名字集合
*/ */
public Set<String> getClassesOfLoadError(){ public Set<String> getClassesOfLoadError() {
return Collections.unmodifiableSet(this.classesOfLoadError); return Collections.unmodifiableSet(this.classesOfLoadError);
} }
@ -397,10 +395,10 @@ public class ClassScanner implements Serializable {
} catch (UnsupportedClassVersionError e) { } catch (UnsupportedClassVersionError e) {
// 版本导致的不兼容的类跳过 // 版本导致的不兼容的类跳过
classesOfLoadError.add(className); classesOfLoadError.add(className);
} catch (Throwable e){ } catch (Throwable e) {
if(!this.ignoreLoadError) { if (false == this.ignoreLoadError) {
throw new RuntimeException(e); throw new RuntimeException(e);
}else{ } else {
classesOfLoadError.add(className); classesOfLoadError.add(className);
} }
} }

View File

@ -37,8 +37,9 @@ public class ClassScanerTest {
@Test @Test
@Ignore @Ignore
public void scanAllPackageIgnoreLoadErrorTest(){ public void scanAllPackageIgnoreLoadErrorTest(){
ClassScanner classScanner = new ClassScanner(null, null); final ClassScanner classScanner = new ClassScanner(null, null);
final Set<Class<?>> classes = classScanner.scan(false,true); classScanner.setIgnoreLoadError(true);
final Set<Class<?>> classes = classScanner.scan(false);
Console.log(classes.size()); Console.log(classes.size());
Console.log(classScanner.getClassesOfLoadError()); Console.log(classScanner.getClassesOfLoadError());
} }