java:基于guava ClassPath工具实现基于包名(package)的类扫描

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值