• 类加载


    @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");
        }
    
    }
  • 相关阅读:
    LaunchScreen.storyboard 换了图片 不能更改过来 解决方案
    iOS Google 地图 集成详解
    Mac下 使用git clone 代码慢解决方案
    iOS 函数式编程
    iOS [self class] 、 [self superclass]、 [super class] 、[super superclass] 几种情况对比
    iOS 链式编程-Block 作为放回值
    iOS block的变量捕获(capture)
    iOS Block本质探究
    iOS 读写操作 处理 pthread_rwlock dispatch_barrier_async
    iOS atomic 和 nonatomic 区别
  • 原文地址:https://www.cnblogs.com/shuzhixia/p/14431423.html
Copyright © 2020-2023  润新知