package com.xiongyingqi.util; import java.io.File; import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Collection; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; /** * Created by 瑛琪<a href="http://xiongyingqi.com">xiongyingqi.com</a> on 2014/10/21 0021. */ public class PackageScanner { private Collection<Package> packages; private Collection<Class<? extends Annotation>> orAnnotations; private Collection<Class<? extends Annotation>> andAnnotations; private Collection<String> startWithStrings; private Collection<String> endWithStrings; private Collection<Class<?>> orImplementsInterface; private Collection<Class<?>> andImplementsInterface; private boolean recursive; private PackageScanner() { } public static PackageScanner newScanner() { PackageScanner packageScanner = new PackageScanner(); packageScanner.packages = new ArrayList<Package>(); packageScanner.orAnnotations = new ArrayList<Class<? extends Annotation>>(); packageScanner.andAnnotations = new ArrayList<Class<? extends Annotation>>(); packageScanner.startWithStrings = new ArrayList<String>(); packageScanner.endWithStrings = new ArrayList<String>(); packageScanner.orImplementsInterface = new ArrayList<Class<?>>(); packageScanner.andImplementsInterface = new ArrayList<Class<?>>(); packageScanner.recursive = true; return packageScanner; } /** * 增加扫描的包 * * @param pkg * @return */ public PackageScanner addPackage(String pkg) { Package aPackage = Package.getPackage(pkg); addPackage(aPackage); return this; } /** * 增加扫描的包 * * @param pkg * @return */ public PackageScanner addPackage(Package pkg) { packages.add(pkg); return this; } /** * 是否递归子包 * * @param recursive */ public PackageScanner recursive(boolean recursive) { this.recursive = recursive; return this; } /** * 或者类被annotation注解 * * @return */ public PackageScanner orAnnotation(Class<? extends Annotation> annotation) { orAnnotations.add(annotation); return this; } /** * 并且类被annotation注解 * * @param annotation * @return */ public PackageScanner andAnnotation(Class<? extends Annotation> annotation) { andAnnotations.add(annotation); return this; } /** * 并且类实现接口 * * @param interfc * @return */ public PackageScanner andInterface(Class<?> interfc) { andImplementsInterface.add(interfc); return this; } /** * 或者类实现接口 * * @param interfc * @return */ public PackageScanner orInterface(Class<?> interfc) { orImplementsInterface.add(interfc); return this; } /** * @param startWithString * @return */ public PackageScanner orStartWithString(String startWithString) { if (StringHelper.nullOrEmpty(startWithString)) { return this; } startWithStrings.add(startWithString); return this; } public PackageScanner orEndWithString(String endWithString) { if (StringHelper.nullOrEmpty(endWithString)) { return this; } endWithStrings.add(endWithString); return this; } /** * 开始扫描 * * @return */ public Collection<Class<?>> scan() { Assert.notEmpty(packages, "待扫描的包为空!"); Collection<Class<?>> classes = new ArrayList<Class<?>>(); ClassLookupHelper.ClassFileFilter classFileFilter = new ClassLookupHelper.ClassFileFilter() { @Override public boolean accept(String klassName, File file, ClassLoader loader) { return true; } @Override public boolean accept(String klassName, JarFile jar, JarEntry entry, ClassLoader loader) { return true; } }; for (Package pkg : packages) { Set<Class<?>> scanClasses = ClassLookupHelper.getClasses(pkg, recursive, classFileFilter); for (Class<?> scanClass : scanClasses) { if (isAnnotationPassed(scanClass) && isStartWithPassed(scanClass) && isInterfacePassed(scanClass)) { classes.add(scanClass); } } } return classes; } private boolean isStartWithPassed(Class<?> clazz) { // 如果是需要判断开始和结尾,则初始值为false if (true ^ (CollectionHelper.notNullAndHasSize(startWithStrings) || CollectionHelper.notNullAndHasSize(endWithStrings))) {// 如果需要判断的为空,则通过 return true; } for (String startWithString : startWithStrings) { if (clazz.getSimpleName().startsWith(startWithString)) { return true; } } for (String endWithString : endWithStrings) { if (clazz.getSimpleName().endsWith(endWithString)) { return true; } } return false; } private boolean isAnnotationPassed(Class<?> clazz) { //true ^ true = false, true ^ false = true boolean flag = true ^ (CollectionHelper.notNullAndHasSize(orAnnotations) || CollectionHelper.notNullAndHasSize(andAnnotations));// 如果判断是否需要注解,则初始值为false for (Class<? extends Annotation> orAnnotation : orAnnotations) { boolean annotationPresent = clazz.isAnnotationPresent(orAnnotation); if (annotationPresent) { flag = true; break; } } for (Class<? extends Annotation> andAnnotation : andAnnotations) { boolean annotationPresent = clazz.isAnnotationPresent(andAnnotation); if (!annotationPresent) { flag = false; break; } } return flag; } private boolean isInterfacePassed(Class<?> clazz) { //true ^ true = false, true ^ false = true boolean flag = true ^ (CollectionHelper.notNullAndHasSize(orImplementsInterface) || CollectionHelper.notNullAndHasSize(andImplementsInterface));// 如果判断是否需要注解,则初始值为false for (Class<?> orInterface : orImplementsInterface) { boolean isImplementsInterface = ClassHelper.isImplementsInterface(clazz, orInterface); // EntityHelper.print("clazz: " + clazz + ", isImplementsInterface: " + isImplementsInterface); if (isImplementsInterface) { flag = true; break; } } for (Class<?> andInterface : andImplementsInterface) { boolean isImplementsInterface = ClassHelper.isImplementsInterface(clazz, andInterface); if (!isImplementsInterface) { flag = false; break; } flag = true; } return flag; } public static void main(String[] args) { Collection<Class<?>> scan = PackageScanner.newScanner().addPackage(PackageScanner.class.getPackage()).orAnnotation(Deprecated.class).scan(); System.out.println(scan); Collection<Class<?>> scan2 = PackageScanner.newScanner().addPackage(ArrayList.class.getPackage()).andInterface(Collection.class).scan(); System.out.println(scan2); } }