在解析xml中有这样两种获取资源的代码
Java代码
SAXReader reader=new SAXReader(); Document doc=reader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)); 与 SAXReader reader = new SAXReader(); Document doc = reader.read(getClass().getResourceAsStream(fileName));
这两种的获取方式有什么不同?还请各位大侠来帮忙!
当前线程的类加载器
和
类加载器
的不同,从字面可以理解,类加载器的机制是有父子关系的,
子类加载器可以加载父类加载器能加载的所有类,
但父类加载器却不能加载子类加载器管理的一些类,
所以,当前线程的类加载器自然可能和当前类的类加载器之间形成父子关系,那自然就不同了
Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName)
运行这个类的当前线程的类加载器
Document doc = reader.read(getClass().getResourceAsStream(fileName));
这个class文件类的加载器
Class
public InputStream getResourceAsStream(String name)查找具有给定名称的资源。[color=red]查找与给定类相关的资源的规则是通过定义类的 class loader 实现的[/color]。此方法委托此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 ClassLoader.getSystemResourceAsStream(java.lang.String)。
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
Document doc=reader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName));
Thread.currentThread()返回当前线程
Thread.currentThread().getContextClassLoader())返回该线程的上下文 ClassLoader。
public ClassLoader getContextClassLoader()返回该线程的上下文 ClassLoader。上下文 ClassLoader 由线程创建者提供,供运行于该线程中的代码在加载类和资源时使用。如果未设定,则默认为父线程的 ClassLoader 上下文。原始线程的上下文 ClassLoader 通常设定为用于加载应用程序的类加载器。
首先,如果有安全管理器,并且调用方的类加载器不是 null,也不同于其上下文类加载器正在被请求的线程上下文类加载器的祖先,则通过 RuntimePermission("getClassLoader") 权限调用该安全管理器的 checkPermission 方法,查看是否可以获得上下文 ClassLoader。
[color=red]这两种方法是不是用哪个都可以,具体有什么区别 [/color]
主要看不同类加载器的路,不同类加载器路径可能不同.
[color=red]获取当前线程的类加载器和获取类加载器有什么不一样[/color]
如果使用的是同一个加载器就一样,反之.