zoukankan      html  css  js  c++  java
  • 类加载

    @Slf4j
    public class ClassUtil {
    
        public static final String FILE_PROTOCOL = "file";
    
        /**
         *
         * @param packageName
         */
        public static Set<Class<?>> extractPackageClass(String packageName){
            //1.获取类加载器
            ClassLoader classLoader = getClassLoader();
            //2.依据类加载器获取到加载的资源
            URL url = classLoader.getResource(packageName.replace(".","/"));
            if (url == null){
                log.warn("unable to retieve anything from package:" + packageName);
                return null;
            }
            //3.更具不同的资源类型,采取不同的获取方式
            Set<Class<?>> classSet = null;
            //过滤文件类型的资源
            if (url.getProtocol().equalsIgnoreCase(FILE_PROTOCOL)){
                classSet = new HashSet<Class<?>>();
                File packageDirectory = new File(url.getPath());
                extractClassFile(classSet,packageDirectory,packageName);
            }
            //TODO 此处可以加入其他类型的资源处理
            return classSet;
        }
    
        /**
         * 递归获取目标package里面的所有class文件(包括子package里的class文件)
         * @param emptyClassSet 装载目标类的集合
         * @param fileSource 文件或者目录
         * @param packageName 包名
         */
        private static void extractClassFile(Set<Class<?>> emptyClassSet, File fileSource, String packageName) {
            if (!fileSource.isDirectory()){
                return;
            }
            //如果是一个文件夹,则调用listfile方法获取文件夹下的文件和文件夹
            File[] files = fileSource.listFiles(new FileFilter() {
                @Override
                public boolean accept(File file) {
                    if (file.isDirectory()){
                        return true;
                    }else {
                        //获取文件的绝对值路径
                        String absolutePath = file.getAbsolutePath();
                        if (absolutePath.endsWith(".class")){
                            //若是class文件,封装成类实例,加载到emptyClassSet里面
                            addToClassSet(absolutePath);
                        }
                    }
                    return false;
                }
                //根据class文件的绝对值路径,获取并生成class路径,并加入classSet中
                private void addToClassSet(String absolutePath) {
                    //1.从class文件的绝对值路径里提取出包含package的类名
                    //如F:springsimpleframeworksrcmainjavacomdevonentitydtoMainPageInfoDTO.java
                    //需要转换成com.devon.entity.dto.MainPageInfoDTO
                    absolutePath = absolutePath.replace(File.separator, ".");
                    String className = absolutePath.substring(absolutePath.indexOf(packageName));
                    className = className.substring(0,className.lastIndexOf("."));
                    //2.通过反射机制获取对应的Class对象并加入到classSet里面
                    Class<?> targetClass = loadClass(className);
                    emptyClassSet.add(targetClass);
                }
            });
            if (files != null){
                for (File f : files) {
                    extractClassFile(emptyClassSet,f,packageName);
                }
            }
        }
    
        /**
         * 获取Class对象
         * @param className
         * @return
         */
        public static Class<?> loadClass(String className){
            try {
                return Class.forName(className);
            } catch (ClassNotFoundException e) {
                log.error("load class error:",e);
                throw new RuntimeException(e);
            }
        }
        /**
         * 类加载器获取项目资源
         * @return
         */
        public static ClassLoader getClassLoader(){
            return Thread.currentThread().getContextClassLoader();
        }
    
        public static void main(String[] args) {
            extractPackageClass("com.devon.entity");
        }
    
    }
  • 相关阅读:
    Java-IO之DeflaterOutputStream和InflaterOutputStream
    myeclipse 破解步骤
    通过Nginx,Tomcat访问日志(access log)记录请求耗时
    关于封装了gevent的request grequest库的使用与讨论
    关于python性能相关测试cProfile库
    python threading模块使用 以及python多线程操作的实践(使用Queue队列模块)
    python格式化字符串Type Error: Format Requires Mapping 的问题
    关于flask自带web应用服务器Werkzeug 使用requests请求时出现的错误。
    关于python 自带csv库的使用心得 附带操作实例以及excel下乱码的解决
    pycharm5.0 快捷键大全osx
  • 原文地址:https://www.cnblogs.com/shuzhixia/p/14431423.html
Copyright © 2011-2022 走看看