google的guava库提供了一个类路径扫描的实用工具ClassPath(参见说明: https://github.com/google/guava/wiki/ReflectionExplained#classpath)工具,适用于非android的Java平台搜索类。基于它可以设计一个过滤包名的搜索工具。
导入依赖库
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>20.0</version>
</dependency>
实现代码:GuavaPackageScanner.java
import java.io.IOException;
import java.util.LinkedHashSet;
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Sets;
import com.google.common.reflect.ClassPath;
import com.google.common.reflect.ClassPath.ClassInfo;
public class GuavaPackageScanner {
private final ClassPath classpath ;
private final ClassLoader classLoader;
private volatile ImmutableSet<Class<?>> classes;
public GuavaPackageScanner() {
try {
this.classLoader = Thread.currentThread().getContextClassLoader();
classpath = ClassPath.from(classLoader);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private ImmutableSet<Class<?>> getClasses() {
if(null == classes) {
synchronized (this) {
if(null == classes) {
classes = FluentIterable.from(classpath.getResources())
.filter(ClassInfo.class)
.transform(new ClassInfoClassBuilder())
.filter(Predicates.notNull())
.toSet();
System.out.printf("%d classes loaded\n",classes.size());
}
}
}
return classes;
}
public LinkedHashSet<Class<?>> getClasses(final String packagename) throws IOException {
return Sets.newLinkedHashSet(
Iterables.filter(getClasses(), new PackageFilter(packagename)));
}
private class ClassInfoClassBuilder implements Function<ClassInfo,Class<?>>{
@Override
public Class<?> apply(ClassInfo input) {
try {
return Class.forName(input.getName(), false, classLoader);
} catch (Throwable e) {
}
return null;
}};
private static class PackageFilter implements Predicate<Class<?>>{
private String packagename;
public PackageFilter(String packagename) {
this.packagename = packagename;
}
@Override
public boolean apply(Class<?> input) {
return input.getPackage().getName().startsWith(packagename);
}
}
}
调用示例:
PackageScannerTest.java
import static org.junit.Assert.*;
import java.util.LinkedHashSet;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class PackageScannerTest {
public static final GuavaPackageScanner GUAVA_PACKAGE_SCANNER = new GuavaPackageScanner();
@Test
public void test6GuavaGetClasses() {
try {
/** 搜索com.google.common.base包下的所有类输出类名 */
LinkedHashSet<Class<?>> urls = GUAVA_PACKAGE_SCANNER.getClasses("com.google.common.base");
for(Class<?> url:urls) {
System.out.printf("class:%s\n",url);
}
System.out.printf("class count:%d\n",urls.size());
} catch (Throwable e) {
e.printStackTrace();
fail();
}
}
}
输出:
3677 classes loaded
class:class com.google.common.base.Absent
class:class com.google.common.base.AbstractIterator1class:classcom.google.common.base.AbstractIterator1 class:class com.google.common.base.AbstractIterator1class:classcom.google.common.base.AbstractIteratorState
class:class com.google.common.base.AbstractIterator
class:class com.google.common.base.Ascii
class:class com.google.common.base.CaseFormat$1
class:class com.google.common.base.CaseFormat$2
class:class com.google.common.base.CaseFormat$3
class:class com.google.common.base.CaseFormat$4
class:class com.google.common.base.CaseFormat5class:classcom.google.common.base.CaseFormat5 class:class com.google.common.base.CaseFormat5class:classcom.google.common.base.CaseFormatStringConverter
class:class com.google.common.base.CaseFormat
class:class com.google.common.base.CharMatcher1class:classcom.google.common.base.CharMatcher1 class:class com.google.common.base.CharMatcher1class:classcom.google.common.base.CharMatcherAnd
class:class com.google.common.base.CharMatcherAnyclass:classcom.google.common.base.CharMatcherAny class:class com.google.common.base.CharMatcherAnyclass:classcom.google.common.base.CharMatcherAnyOf
class:class com.google.common.base.CharMatcherAsciiclass:classcom.google.common.base.CharMatcherAscii class:class com.google.common.base.CharMatcherAsciiclass:classcom.google.common.base.CharMatcherBitSetMatcher
class:class com.google.common.base.CharMatcherBreakingWhitespaceclass:classcom.google.common.base.CharMatcherBreakingWhitespace class:class com.google.common.base.CharMatcherBreakingWhitespaceclass:classcom.google.common.base.CharMatcherDigit
class:class com.google.common.base.CharMatcherFastMatcherclass:classcom.google.common.base.CharMatcherFastMatcher class:class com.google.common.base.CharMatcherFastMatcherclass:classcom.google.common.base.CharMatcherForPredicate
class:class com.google.common.base.CharMatcherInRangeclass:classcom.google.common.base.CharMatcherInRange class:class com.google.common.base.CharMatcherInRangeclass:classcom.google.common.base.CharMatcherInvisible
class:class com.google.common.base.CharMatcherIsclass:classcom.google.common.base.CharMatcherIs class:class com.google.common.base.CharMatcherIsclass:classcom.google.common.base.CharMatcherIsEither
class:class com.google.common.base.CharMatcherIsNotclass:classcom.google.common.base.CharMatcherIsNot class:class com.google.common.base.CharMatcherIsNotclass:classcom.google.common.base.CharMatcherJavaDigit
class:class com.google.common.base.CharMatcherJavaIsoControlclass:classcom.google.common.base.CharMatcherJavaIsoControl class:class com.google.common.base.CharMatcherJavaIsoControlclass:classcom.google.common.base.CharMatcherJavaLetter
class:class com.google.common.base.CharMatcherJavaLetterOrDigitclass:classcom.google.common.base.CharMatcherJavaLetterOrDigit class:class com.google.common.base.CharMatcherJavaLetterOrDigitclass:classcom.google.common.base.CharMatcherJavaLowerCase
class:class com.google.common.base.CharMatcherJavaUpperCaseclass:classcom.google.common.base.CharMatcherJavaUpperCase class:class com.google.common.base.CharMatcherJavaUpperCaseclass:classcom.google.common.base.CharMatcherNamedFastMatcher
class:class com.google.common.base.CharMatcherNegatedclass:classcom.google.common.base.CharMatcherNegated class:class com.google.common.base.CharMatcherNegatedclass:classcom.google.common.base.CharMatcherNegatedFastMatcher
class:class com.google.common.base.CharMatcherNoneclass:classcom.google.common.base.CharMatcherNone class:class com.google.common.base.CharMatcherNoneclass:classcom.google.common.base.CharMatcherOr
class:class com.google.common.base.CharMatcherRangesMatcherclass:classcom.google.common.base.CharMatcherRangesMatcher class:class com.google.common.base.CharMatcherRangesMatcherclass:classcom.google.common.base.CharMatcherSingleWidth
class:class com.google.common.base.CharMatcher$Whitespace
class:class com.google.common.base.CharMatcher
class:class com.google.common.base.Charsets
class:class com.google.common.base.CommonMatcher
class:class com.google.common.base.CommonPattern
class:class com.google.common.base.Converter$1$1
class:class com.google.common.base.Converter1class:classcom.google.common.base.Converter1 class:class com.google.common.base.Converter1class:classcom.google.common.base.ConverterConverterComposition
class:class com.google.common.base.ConverterFunctionBasedConverterclass:classcom.google.common.base.ConverterFunctionBasedConverter class:class com.google.common.base.ConverterFunctionBasedConverterclass:classcom.google.common.base.ConverterIdentityConverter
class:class com.google.common.base.ConverterReverseConverterclass:classcom.google.common.base.Converterclass:classcom.google.common.base.Defaultsclass:classcom.google.common.base.EnumsReverseConverter class:class com.google.common.base.Converter class:class com.google.common.base.Defaults class:class com.google.common.base.EnumsReverseConverterclass:classcom.google.common.base.Converterclass:classcom.google.common.base.Defaultsclass:classcom.google.common.base.EnumsStringConverter
class:class com.google.common.base.Enums
class:class com.google.common.base.Equivalence1class:classcom.google.common.base.Equivalence1 class:class com.google.common.base.Equivalence1class:classcom.google.common.base.EquivalenceEquals
class:class com.google.common.base.EquivalenceEquivalentToPredicateclass:classcom.google.common.base.EquivalenceEquivalentToPredicate class:class com.google.common.base.EquivalenceEquivalentToPredicateclass:classcom.google.common.base.EquivalenceIdentity
class:class com.google.common.base.EquivalenceWrapperclass:classcom.google.common.base.Equivalenceclass:classcom.google.common.base.ExtraObjectsMethodsForWebclass:classcom.google.common.base.FinalizablePhantomReferenceclass:interfacecom.google.common.base.FinalizableReferenceclass:classcom.google.common.base.FinalizableReferenceQueueWrapper class:class com.google.common.base.Equivalence class:class com.google.common.base.ExtraObjectsMethodsForWeb class:class com.google.common.base.FinalizablePhantomReference class:interface com.google.common.base.FinalizableReference class:class com.google.common.base.FinalizableReferenceQueueWrapperclass:classcom.google.common.base.Equivalenceclass:classcom.google.common.base.ExtraObjectsMethodsForWebclass:classcom.google.common.base.FinalizablePhantomReferenceclass:interfacecom.google.common.base.FinalizableReferenceclass:classcom.google.common.base.FinalizableReferenceQueueDecoupledLoader
class:class com.google.common.base.FinalizableReferenceQueueDirectLoaderclass:interfacecom.google.common.base.FinalizableReferenceQueueDirectLoader class:interface com.google.common.base.FinalizableReferenceQueueDirectLoaderclass:interfacecom.google.common.base.FinalizableReferenceQueueFinalizerLoader
class:class com.google.common.base.FinalizableReferenceQueue$SystemLoader
class:class com.google.common.base.FinalizableReferenceQueue
class:class com.google.common.base.FinalizableSoftReference
class:class com.google.common.base.FinalizableWeakReference
class:interface com.google.common.base.Function
class:class com.google.common.base.FunctionalEquivalence
class:class com.google.common.base.Functions1class:classcom.google.common.base.Functions1 class:class com.google.common.base.Functions1class:classcom.google.common.base.FunctionsConstantFunction
class:class com.google.common.base.FunctionsForMapWithDefaultclass:classcom.google.common.base.FunctionsForMapWithDefault class:class com.google.common.base.FunctionsForMapWithDefaultclass:classcom.google.common.base.FunctionsFunctionComposition
class:class com.google.common.base.FunctionsFunctionForMapNoDefaultclass:classcom.google.common.base.FunctionsFunctionForMapNoDefault class:class com.google.common.base.FunctionsFunctionForMapNoDefaultclass:classcom.google.common.base.FunctionsIdentityFunction
class:class com.google.common.base.FunctionsPredicateFunctionclass:classcom.google.common.base.FunctionsPredicateFunction class:class com.google.common.base.FunctionsPredicateFunctionclass:classcom.google.common.base.FunctionsSupplierFunction
class:class com.google.common.base.FunctionsToStringFunctionclass:classcom.google.common.base.Functionsclass:classcom.google.common.base.JdkPatternToStringFunction class:class com.google.common.base.Functions class:class com.google.common.base.JdkPatternToStringFunctionclass:classcom.google.common.base.Functionsclass:classcom.google.common.base.JdkPatternJdkMatcher
class:class com.google.common.base.JdkPattern
class:class com.google.common.base.Joiner$1
class:class com.google.common.base.Joiner$2
class:class com.google.common.base.Joiner3class:classcom.google.common.base.Joiner3 class:class com.google.common.base.Joiner3class:classcom.google.common.base.JoinerMapJoiner
class:class com.google.common.base.Joiner
class:class com.google.common.base.MoreObjects1class:classcom.google.common.base.MoreObjects1 class:class com.google.common.base.MoreObjects1class:classcom.google.common.base.MoreObjectsToStringHelperValueHolderclass:classcom.google.common.base.MoreObjectsValueHolder class:class com.google.common.base.MoreObjectsValueHolderclass:classcom.google.common.base.MoreObjectsToStringHelper
class:class com.google.common.base.MoreObjects
class:class com.google.common.base.Objects1class:classcom.google.common.base.Objects1 class:class com.google.common.base.Objects1class:classcom.google.common.base.ObjectsToStringHelperValueHolderclass:classcom.google.common.base.ObjectsValueHolder class:class com.google.common.base.ObjectsValueHolderclass:classcom.google.common.base.ObjectsToStringHelper
class:class com.google.common.base.Objects
class:class com.google.common.base.Optional$1$1
class:class com.google.common.base.Optional$1
class:class com.google.common.base.Optional
class:class com.google.common.base.PairwiseEquivalence
class:interface com.google.common.base.PatternCompiler
class:class com.google.common.base.Platform1class:classcom.google.common.base.Platform1 class:class com.google.common.base.Platform1class:classcom.google.common.base.PlatformJdkPatternCompiler
class:class com.google.common.base.Platform
class:class com.google.common.base.Preconditions
class:interface com.google.common.base.Predicate
class:class com.google.common.base.Predicates1class:classcom.google.common.base.Predicates1 class:class com.google.common.base.Predicates1class:classcom.google.common.base.PredicatesAndPredicate
class:class com.google.common.base.PredicatesCompositionPredicateclass:classcom.google.common.base.PredicatesCompositionPredicate class:class com.google.common.base.PredicatesCompositionPredicateclass:classcom.google.common.base.PredicatesContainsPatternFromStringPredicate
class:class com.google.common.base.PredicatesContainsPatternPredicateclass:classcom.google.common.base.PredicatesContainsPatternPredicate class:class com.google.common.base.PredicatesContainsPatternPredicateclass:classcom.google.common.base.PredicatesInPredicate
class:class com.google.common.base.PredicatesInstanceOfPredicateclass:classcom.google.common.base.PredicatesInstanceOfPredicate class:class com.google.common.base.PredicatesInstanceOfPredicateclass:classcom.google.common.base.PredicatesIsEqualToPredicate
class:class com.google.common.base.PredicatesNotPredicateclass:classcom.google.common.base.PredicatesNotPredicate class:class com.google.common.base.PredicatesNotPredicateclass:classcom.google.common.base.PredicatesObjectPredicate1class:classcom.google.common.base.Predicates1 class:class com.google.common.base.Predicates1class:classcom.google.common.base.PredicatesObjectPredicate2class:classcom.google.common.base.Predicates2 class:class com.google.common.base.Predicates2class:classcom.google.common.base.PredicatesObjectPredicate3class:classcom.google.common.base.Predicates3 class:class com.google.common.base.Predicates3class:classcom.google.common.base.PredicatesObjectPredicate4class:classcom.google.common.base.Predicates4 class:class com.google.common.base.Predicates4class:classcom.google.common.base.PredicatesObjectPredicate
class:class com.google.common.base.PredicatesOrPredicateclass:classcom.google.common.base.PredicatesOrPredicate class:class com.google.common.base.PredicatesOrPredicateclass:classcom.google.common.base.PredicatesSubtypeOfPredicate
class:class com.google.common.base.Predicates
class:class com.google.common.base.Present
class:class com.google.common.base.SmallCharMatcher
class:class com.google.common.base.Splitter$1$1
class:class com.google.common.base.Splitter$1
class:class com.google.common.base.Splitter$2$1
class:class com.google.common.base.Splitter$2
class:class com.google.common.base.Splitter$3$1
class:class com.google.common.base.Splitter$3
class:class com.google.common.base.Splitter$4$1
class:class com.google.common.base.Splitter$4
class:class com.google.common.base.Splitter5class:classcom.google.common.base.Splitter5 class:class com.google.common.base.Splitter5class:classcom.google.common.base.SplitterMapSplitter
class:class com.google.common.base.SplitterSplittingIteratorclass:interfacecom.google.common.base.SplitterSplittingIterator class:interface com.google.common.base.SplitterSplittingIteratorclass:interfacecom.google.common.base.SplitterStrategy
class:class com.google.common.base.Splitter
class:class com.google.common.base.StandardSystemProperty
class:class com.google.common.base.Stopwatch1class:classcom.google.common.base.Stopwatchclass:classcom.google.common.base.Stringsclass:interfacecom.google.common.base.Supplierclass:classcom.google.common.base.Suppliers1 class:class com.google.common.base.Stopwatch class:class com.google.common.base.Strings class:interface com.google.common.base.Supplier class:class com.google.common.base.Suppliers1class:classcom.google.common.base.Stopwatchclass:classcom.google.common.base.Stringsclass:interfacecom.google.common.base.Supplierclass:classcom.google.common.base.SuppliersExpiringMemoizingSupplier
class:class com.google.common.base.SuppliersMemoizingSupplierclass:classcom.google.common.base.SuppliersMemoizingSupplier class:class com.google.common.base.SuppliersMemoizingSupplierclass:classcom.google.common.base.SuppliersSupplierComposition
class:interface com.google.common.base.SuppliersSupplierFunctionclass:classcom.google.common.base.SuppliersSupplierFunction class:class com.google.common.base.SuppliersSupplierFunctionclass:classcom.google.common.base.SuppliersSupplierFunctionImpl
class:class com.google.common.base.SuppliersSupplierOfInstanceclass:classcom.google.common.base.SuppliersSupplierOfInstance class:class com.google.common.base.SuppliersSupplierOfInstanceclass:classcom.google.common.base.SuppliersThreadSafeSupplier
class:class com.google.common.base.Suppliers
class:class com.google.common.base.Throwables$1
class:class com.google.common.base.Throwables
class:class com.google.common.base.Ticker$1
class:class com.google.common.base.Ticker
class:class com.google.common.base.Utf8
class:class com.google.common.base.Verify
class:class com.google.common.base.VerifyException
class:class com.google.common.base.internal.Finalizer
class:interface com.google.common.base.package-info
class count:162