11package cn .xeblog .commons .util ;
22
3+ import cn .hutool .core .util .ClassUtil ;
34import cn .hutool .core .util .StrUtil ;
45
56import java .io .IOException ;
@@ -25,33 +26,57 @@ public static Set<Class<?>> scan(String path, String pkg) {
2526 }
2627
2728 public static Set <Class <?>> scan (String path , String pkg , Class <? extends Annotation > annotationClass ) {
29+ return scan (path , pkg , annotationClass , null );
30+ }
31+
32+ public static Set <Class <?>> scanSubClass (String path , String pkg , Class superClass ) {
33+ return scan (path , pkg , null , superClass );
34+ }
35+
36+ public static Set <Class <?>> scan (String path , String pkg , Class <? extends Annotation > annotationClass , Class superClass ) {
2837 Set <Class <?>> classes = new HashSet <>();
2938 String pkgPath = null ;
3039 if (StrUtil .isNotBlank (pkg )) {
3140 pkgPath = pkg .replace ("." , "/" );
3241 }
3342
3443 try {
35- JarFile jar = new JarFile ( path );
36- Enumeration < JarEntry > entryEnumeration = jar . entries ();
37- while ( entryEnumeration . hasMoreElements ( )) {
38- JarEntry entry = entryEnumeration . nextElement () ;
39- String clazzName = entry . getName ();
40- if ( pkgPath != null && ! clazzName . startsWith ( pkgPath )) {
41- continue ;
42- }
44+ if ( path == null ) {
45+ classes = ClassUtil . scanPackage ( pkg , ( clazz ) -> {
46+ if (! isAnnotationPresent ( clazz , annotationClass )) {
47+ return false ;
48+ }
49+ if (! isSubClass ( clazz , superClass )) {
50+ return false ;
51+ }
4352
44- if (clazzName .endsWith (".class" )) {
45- clazzName = clazzName .substring (0 , clazzName .length () - 6 );
46- clazzName = clazzName .replace ("/" , "." );
47- try {
48- Class <?> clazz = Class .forName (clazzName );
49- if (annotationClass != null && !clazz .isAnnotationPresent (annotationClass )) {
50- continue ;
51- }
53+ return true ;
54+ });
55+ } else {
56+ JarFile jar = new JarFile (path );
57+ Enumeration <JarEntry > entryEnumeration = jar .entries ();
58+ while (entryEnumeration .hasMoreElements ()) {
59+ JarEntry entry = entryEnumeration .nextElement ();
60+ String clazzName = entry .getName ();
61+ if (pkgPath != null && !clazzName .startsWith (pkgPath )) {
62+ continue ;
63+ }
64+
65+ if (clazzName .endsWith (".class" )) {
66+ clazzName = clazzName .substring (0 , clazzName .length () - 6 );
67+ clazzName = clazzName .replace ("/" , "." );
68+ try {
69+ Class <?> clazz = Class .forName (clazzName );
70+ if (!isAnnotationPresent (clazz , annotationClass )) {
71+ continue ;
72+ }
73+ if (!isSubClass (clazz , superClass )) {
74+ continue ;
75+ }
5276
53- classes .add (clazz );
54- } catch (Throwable e ) {
77+ classes .add (clazz );
78+ } catch (Throwable e ) {
79+ }
5580 }
5681 }
5782 }
@@ -62,4 +87,20 @@ public static Set<Class<?>> scan(String path, String pkg, Class<? extends Annota
6287 return classes ;
6388 }
6489
90+ public static boolean isAnnotationPresent (Class clazz , Class <? extends Annotation > annotationClass ) {
91+ if (clazz == null || annotationClass == null ) {
92+ return true ;
93+ }
94+
95+ return clazz .isAnnotationPresent (annotationClass );
96+ }
97+
98+ public static boolean isSubClass (Class clazz , Class superClass ) {
99+ if (clazz == null || superClass == null ) {
100+ return true ;
101+ }
102+
103+ return superClass .isAssignableFrom (clazz ) && !superClass .equals (clazz );
104+ }
105+
65106}
0 commit comments