java扫描源码或者jar包中的class文件
2016-03-02 00:00
477 查看
摘要: 扫描class目录或者jar包中的多个文件,spring的文件扫描
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<? extends Annotation> 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<? extends Annotation> 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; } public static void main(String[] args) { ClassScaner cs = new ClassScaner(); Set<Class<?>> clazz = cs.doScan("com.test.util"); System.out.println( clazz ); } }
相关文章推荐
- File文件对象的一些笔记
- Java中方法参数传递----传值与传引用的理解
- No_16_0229 Java基础学习第九天
- 在web.xml中配置了struts2的filter后访问jsp出现404
- Java8 HashMap实现原理探究
- java如何访问局域网共享文件
- Java 内存区域和GC机制
- 抽象类和接口的区别
- Java中的String为什么是不可变的
- java自动装箱性能
- Java 用DBCP连接数据库。
- eclipse提交项目到github
- Downloading a file from spring controllers
- spring 配置内存溢出监听器、文件上传、ie下载json问题
- [置顶] JavaSE学习笔记_7:Java内部类
- spring context架构--静态结构
- [置顶] JavaSE学习笔记_5:Java多态
- 用WebCollector制作一个爬取《知乎》并进行问题精准抽取的爬虫(JAVA)
- [置顶] JavaSE学习笔记_4:Java继承
- Java认证考试实例疑难辨析(13)