Spring 获取一个包和子包上面所有的类
Spring 获取一个包和子包下面所有的类from:http://www.iteye.com/topic/203267?参考spring2.5里面的compon
Spring 获取一个包和子包下面所有的类
from:http://www.iteye.com/topic/203267
?
参考spring2.5里面的component-scan功能,提炼出这样一个工具类,此类依赖spring但不依赖spring容器,请注意此类搜索不到jdk的包如java.lang
??import?java.io.IOException; ??import?java.lang.annotation.Annotation; ??import?java.util.HashSet; ??import?java.util.LinkedList; ??import?java.util.List; ??import?java.util.Set; ????import?org.springframework.beans.factory.BeanDefinitionStoreException; ??import?org.springframework.context.ResourceLoaderAware; ??import?org.springframework.core.io.Resource; ??import?org.springframework.core.io.ResourceLoader; ??import?org.springframework.core.io.support.PathMatchingResourcePatternResolver; ??import?org.springframework.core.io.support.ResourcePatternResolver; ??import?org.springframework.core.io.support.ResourcePatternUtils; ??import?org.springframework.core.type.classreading.CachingMetadataReaderFactory; ??import?org.springframework.core.type.classreading.MetadataReader; ??import?org.springframework.core.type.classreading.MetadataReaderFactory; ??import?org.springframework.core.type.filter.AnnotationTypeFilter; ??import?org.springframework.core.type.filter.TypeFilter; ??import?org.springframework.util.SystemPropertyUtils; ????public?class?ClassScaner?implements?ResourceLoaderAware?{ ????????private?ResourcePatternResolver?resourcePatternResolver?=?new?PathMatchingResourcePatternResolver(); ????????private?final?List<TypeFilter>?includeFilters?=?new?LinkedList<TypeFilter>(); ????????private?final?List<TypeFilter>?excludeFilters?=?new?LinkedList<TypeFilter>(); ????????private?MetadataReaderFactory?metadataReaderFactory?=?new?CachingMetadataReaderFactory( ??????????????this.resourcePatternResolver); ????????public?ClassScaner()?{ ????????} ????????public?void?setResourceLoader(ResourceLoader?resourceLoader)?{ ??????????this.resourcePatternResolver?=?ResourcePatternUtils ??????????????????.getResourcePatternResolver(resourceLoader); ??????????this.metadataReaderFactory?=?new?CachingMetadataReaderFactory( ??????????????????resourceLoader); ??????} ????????public?final?ResourceLoader?getResourceLoader()?{ ??????????return?this.resourcePatternResolver; ??????} ????????public?void?addIncludeFilter(TypeFilter?includeFilter)?{ ??????????this.includeFilters.add(includeFilter); ??????} ????????public?void?addExcludeFilter(TypeFilter?excludeFilter)?{ ??????????this.excludeFilters.add(0,?excludeFilter); ??????} ????????public?void?resetFilters(boolean?useDefaultFilters)?{ ??????????this.includeFilters.clear(); ??????????this.excludeFilters.clear(); ??????} ????????public?static?Set<Class>?scan(String?basePackage, ??????????????Class<??extends?Annotation>...?annotations)?{ ??????????ClassScaner?cs?=?new?ClassScaner(); ??????????for?(Class?anno?:?annotations) ??????????????cs.addIncludeFilter(new?AnnotationTypeFilter(anno)); ??????????return?cs.doScan(basePackage); ??????} ????????public?static?Set<Class>?scan(String[]?basePackages, ??????????????Class<??extends?Annotation>...?annotations)?{ ??????????ClassScaner?cs?=?new?ClassScaner(); ??????????for?(Class?anno?:?annotations) ??????????????cs.addIncludeFilter(new?AnnotationTypeFilter(anno)); ??????????Set<Class>?classes?=?new?HashSet<Class>(); ??????????for?(String?s?:?basePackages) ??????????????classes.addAll(cs.doScan(s)); ??????????return?classes; ??????} ????????public?Set<Class>?doScan(String?basePackage)?{ ??????????Set<Class>?classes?=?new?HashSet<Class>(); ??????????try?{ ??????????????String?packageSearchPath?=?ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX ??????????????????????+?org.springframework.util.ClassUtils ??????????????????????????????.convertClassNameToResourcePath(SystemPropertyUtils ??????????????????????????????????????.resolvePlaceholders(basePackage)) ??????????????????????+?"/**/*.class"; ??????????????Resource[]?resources?=?this.resourcePatternResolver ??????????????????????.getResources(packageSearchPath); ????????????????for?(int?i?=?0;?i?<?resources.length;?i++)?{ ??????????????????Resource?resource?=?resources[i]; ??????????????????if?(resource.isReadable())?{ ??????????????????????MetadataReader?metadataReader?=?this.metadataReaderFactory ??????????????????????????????.getMetadataReader(resource); ??????????????????????if?((includeFilters.size()?==?0?&&?excludeFilters.size()?==?0) ??????????????????????????????||?matches(metadataReader))?{ ??????????????????????????try?{ ??????????????????????????????classes.add(Class.forName(metadataReader ??????????????????????????????????????.getClassMetadata().getClassName())); ??????????????????????????}?catch?(ClassNotFoundException?e)?{ ??????????????????????????????e.printStackTrace(); ??????????????????????????} ????????????????????????} ??????????????????} ??????????????} ??????????}?catch?(IOException?ex)?{ ??????????????throw?new?BeanDefinitionStoreException( ??????????????????????"I/O?failure?during?classpath?scanning",?ex); ??????????} ??????????return?classes; ??????} ????????protected?boolean?matches(MetadataReader?metadataReader)?throws?IOException?{ ??????????for?(TypeFilter?tf?:?this.excludeFilters)?{ ??????????????if?(tf.match(metadataReader,?this.metadataReaderFactory))?{ ??????????????????return?false; ??????????????} ??????????} ??????????for?(TypeFilter?tf?:?this.includeFilters)?{ ??????????????if?(tf.match(metadataReader,?this.metadataReaderFactory))?{ ??????????????????return?true; ??????????????} ??????????} ??????????return?false; ??????} ????}??