From f41950704952653a0e13672a190a5be03f45ae7f Mon Sep 17 00:00:00 2001 From: "frank.lee" Date: Fri, 28 Oct 2022 12:31:48 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E7=89=B9=E6=80=A7]=20cn.hutool.core.?= =?UTF-8?q?lang.ClassScanner=20scan(boolean,boolean)=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BF=BD=E7=95=A5=E5=8A=A0=E8=BD=BD=E9=94=99=E8=AF=AF=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E6=89=AB=E6=8F=8F=E6=96=B9=E6=B3=95=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E6=94=B6=E9=9B=86=E4=BA=86=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=EF=BC=8C=E4=BD=BF=E7=94=A8=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=BC=96=E5=86=99=E4=BA=86=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E8=BF=9B=E8=A1=8C=E6=B5=8B=E8=AF=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当前 JavaSourceCompilerTest 的几个类恰好不能正常加载,被正确忽略。 --- .../cn/hutool/core/lang/ClassScanner.java | 52 +++++++++++++++++-- .../cn/hutool/core/lang/ClassScanerTest.java | 10 ++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java b/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java index 3b65a5d6c..06bca8ec3 100755 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java @@ -66,6 +66,16 @@ public class ClassScanner implements Serializable { */ private final Set> classes = new HashSet<>(); + /** + * 忽略loadClass时的错误 + */ + private boolean ignoreLoadError = false; + + /** + * 获取加载错误的类名列表 + */ + private final Set classesOfLoadError = new HashSet<>(); + /** * 扫描指定包路径下所有包含指定注解的类,包括其他加载的jar或者类 * @@ -221,6 +231,19 @@ public class ClassScanner implements Serializable { return scan(false); } + /** + * 扫描 + * + * @param forceScanJavaClassPaths 是否强制扫描其他位于classpath关联jar中的类 + * @param ignoreLoadError 是否或略扫描时loadClass的异常 + * @return 类集合 + * + */ + public Set> scan(boolean forceScanJavaClassPaths,boolean ignoreLoadError){ + this.ignoreLoadError = ignoreLoadError; + return scan(forceScanJavaClassPaths); + } + /** * 扫描包路径下满足class过滤器条件的所有class文件 * @@ -229,6 +252,11 @@ public class ClassScanner implements Serializable { * @since 5.7.5 */ public Set> scan(boolean forceScanJavaClassPaths) { + + //多次扫描时,清理上次扫描历史 + this.classes.clear(); + this.classesOfLoadError.clear(); + for (URL url : ResourceUtil.getResourceIter(this.packagePath)) { switch (url.getProtocol()) { case "file": @@ -267,8 +295,20 @@ public class ClassScanner implements Serializable { this.classLoader = classLoader; } + /** + * 忽略加载错误扫描后,可以获得之前扫描时加载错误的类名字集合 + */ + public Set getClassesOfLoadError(){ + return Collections.unmodifiableSet(this.classesOfLoadError); + } + // --------------------------------------------------------------------------------------------------- Private method start + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } + /** * 扫描Java指定的ClassPath路径 */ @@ -341,7 +381,7 @@ public class ClassScanner implements Serializable { * @param className 类名 * @return 加载的类 */ - private Class loadClass(String className) { + protected Class loadClass(String className) { ClassLoader loader = this.classLoader; if (null == loader) { loader = ClassLoaderUtil.getClassLoader(); @@ -353,10 +393,16 @@ public class ClassScanner implements Serializable { clazz = Class.forName(className, this.initialize, loader); } catch (NoClassDefFoundError | ClassNotFoundException e) { // 由于依赖库导致的类无法加载,直接跳过此类 + classesOfLoadError.add(className); } catch (UnsupportedClassVersionError e) { // 版本导致的不兼容的类,跳过 - } catch (Exception e) { - throw new RuntimeException(e); + classesOfLoadError.add(className); + } catch (Throwable e){ + if(!this.ignoreLoadError) { + throw new RuntimeException(e); + }else{ + classesOfLoadError.add(className); + } } return clazz; } diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ClassScanerTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ClassScanerTest.java index 8974f0384..2c2d243df 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/ClassScanerTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ClassScanerTest.java @@ -32,4 +32,14 @@ public class ClassScanerTest { final Set> classes = ClassScanner.scanAllPackageBySuper(null, Iterable.class); Console.log(classes.size()); } + + + @Test + @Ignore + public void scanAllPackageIgnoreLoadErrorTest(){ + ClassScanner classScanner = new ClassScanner(null, null); + final Set> classes = classScanner.scan(false,true); + Console.log(classes.size()); + Console.log(classScanner.getClassesOfLoadError()); + } }