2018-11-17 ClassLoaderWrapper

ClassLoaderWrapper,Resources使用的,具体的用来加载资源的类

package org.apache.ibatis.io;

import java.io.InputStream;
import java.net.URL;

/封装了5个类加载器/
public class ClassLoaderWrapper {

ClassLoader defaultClassLoader;/*在Resources类中设置*/
ClassLoader systemClassLoader;/*在构造方法中初始化*/

ClassLoaderWrapper() {/*构造方法*/
    try {
        systemClassLoader = ClassLoader.getSystemClassLoader();/*初始化类加载器*/
    } catch (SecurityException ignored) {
        // AccessControlException on Google App Engine
    }
}
/*获取类加载器数组*/
ClassLoader[] getClassLoaders(ClassLoader classLoader) {
    return new ClassLoader[]{
            classLoader,/*参数传入*/
            defaultClassLoader,/*在Resources中设置*/
            Thread.currentThread().getContextClassLoader(),/*当前线程绑定的类加载器*/
            getClass().getClassLoader(),/*当前类使用的类加载器*/
            systemClassLoader};/*在Resources中设置*/
}

/*使用当前类路径获取资源作为URL*/
public URL getResourceAsURL(String resource) {
    return getResourceAsURL(resource, getClassLoaders(null));
}
/*使用当前类路径获取资源作为URL,指定的类加载器*/
public URL getResourceAsURL(String resource, ClassLoader classLoader) {
    return getResourceAsURL(resource, getClassLoaders(classLoader));
}

URL getResourceAsURL(String resource, ClassLoader[] classLoader) {
    URL url;
    for (ClassLoader cl : classLoader) {
        if (null != cl) {
            url = cl.getResource(resource);
            if (null == url) {
                url = cl.getResource("/" + resource);
            }
            if (null != url) {
                return url;
            }
        }
    }
    return null;
}

/*从指定路径获取资源作为stream*/
public InputStream getResourceAsStream(String resource) {
    return getResourceAsStream(resource, getClassLoaders(null));
}

/*从指定路径获取资源作为stream指定classLoader*/
public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
    return getResourceAsStream(resource, getClassLoaders(classLoader));
}
/*从指定路径获取资源作为stream,具体实现*/
InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
    for (ClassLoader cl : classLoader) {
        if (null != cl) {
            // 根据入参resource,读取该路径下文件
            InputStream returnValue = cl.getResourceAsStream(resource);
            // 如果没有,加上“/”再尝试读取
            if (null == returnValue) {
                returnValue = cl.getResourceAsStream("/" + resource);
            }
            //如果读取到,终止循环,返回结果
            if (null != returnValue) {
                return returnValue;
            }
        }
    }
    return null;
}


/*获取name类的类对象,对外暴漏的方法*/
public Class<?> classForName(String name) throws ClassNotFoundException {
    return classForName(name, getClassLoaders(null));
}
/*使用classLoader获取name类的类对象,对外暴漏的方法*/
public Class<?> classForName(String name, ClassLoader classLoader) throws ClassNotFoundException {
    return classForName(name, getClassLoaders(classLoader));
}
/*使用classLoader获取name类的类对象*/
Class<?> classForName(String name, ClassLoader[] classLoader) throws ClassNotFoundException {
    for (ClassLoader cl : classLoader) {
        if (null != cl) {
            try {
                Class<?> c = Class.forName(name, true, cl);
                if (null != c) {
                    return c;
                }
            } catch (ClassNotFoundException e) {
                // we'll ignore this until all classloaders fail to locate the class
            }
        }
    }
    throw new ClassNotFoundException("Cannot find class: " + name);
}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,742评论 18 399
  • 来源:deep machine learning meets cybersecurity 一、问题 1、恶意软件成...
    Threathunter阅读 498评论 0 0
  • 《习惯力》 001 在解决问题的过程中,不要犯1、2、3、7错误,说服执行方案过程中涉及到的人是开始执行前的关键步...
    墨瞳_3611阅读 180评论 0 0