您的位置:首页 > 编程语言 > Java开发

分享java类的扫描代码

2015-10-17 10:31 495 查看
1.按照指定包扫描
2.按照指定注解类过滤

package com.bswan;

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.apache.log4j.Logger;

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.ClassUtils;

import org.springframework.util.SystemPropertyUtils;

import core.plugin.table.Table;

import core.route.Controllers;

@SuppressWarnings({ "rawtypes", "unchecked" })

public class ClassScaner implements ResourceLoaderAware {

    /**

     * log

     */

    private static Logger logger = Logger.getLogger(ClassScaner.class);

     

    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 + ClassUtils.convertClassNameToResourcePath(SystemPropertyUtils.resolvePlaceholders(basePackage))+ "/**/*.class";

            System.out.println(packageSearchPath);

            Resource[] resources = this.resourcePatternResolver.getResources(packageSearchPath);

            for (int i = 0; i < resources.length; i++) {

                Resource resource = resources[i];

                System.out.println(resource.getFilename());

                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) {

                            logger.error(e.getMessage());

                        }

                    }

                }

            }

        } 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) {

        Set<Class> set = ClassScaner.scan("com.bswan", Table.class,Controllers.class);

        for (Class class1 : set) {

            System.out.println(class1.getName());

        }

    }

}扫描指定package下所有的类

思路:

有的web server在部署运行时会解压jar包,因此class文件会在普通的文件目录下。如果web server不解压jar包,则class文件会直接存在于Jar包中。对于前者,只需定位到class文件所在目录,然后将class文件名读取出即可;对于后者,则需先定位到jar包所在目录,然后使用
JarInputStream
读取Jar包,得到class类名。网站推广

实现:

这是从写好的项目代码中直接copy出来的,如果要运行这段代码,需要把所有的
Logger.debug
改成
System.out.println()


?
上面的代码中用到了
StringUtils
类,如下:

?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  代码