Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

转载 2016年08月31日 10:51:15

打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。
首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLoader.getSystemClassLoader()。
而我们后面的WEB程序,里面的jar、resources都是由Tomcat内部来加载的,所以你在代码中动态加载jar、资源文件的时候,首先应该是使用Thread.currentThread().getContextClassLoader()。如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致(因为Java天生的多线程)。
Test.class.getClassLoader()一般用在getResource,因为你想要获取某个资源文件的时候,这个资源文件的位置是相对固定的。

java的类加载机制(jvm规范)是委托模型,简单的说,如果一个类加载器想要加载一个类,首先它会委托给它的parent去加载,如果它的所有parent都没有成功的加载那么它才会自己亲自来,有点儿像儿子使唤老子的感觉。

 

如果你使用Test.class.getClassLoader(),可能会导致和当前线程所运行的类加载器不一致 :Class.getClassLoader() returns the class loader for the class. Some implementations may use null to represent the bootstrap class loader. This method will return null in such implementations if this class was loaded by the bootstrap class loader.


对于上面转载内容补充一下

Tomcat为了实现对jar包的加载进行权限控制,所谓权限控制,就是指加载器只能加载某一路径下的jar包,其他路径下的jar包没有权限加载,实现了自定义的加载器。

并且java有三个初始类加载器,当java虚拟机启动时,它们会按照以下顺序启动:Bootstrap classloader -> extension classloader -> system classloader。三者的关系:bootstrap classloader是extension classloader的parent,extension classloader是system classloader的parent。

所以上面所说的  “有可能导致当前线程所运行的类加载器不一致"的理由

区别:Thread.currentThread().getContextClassLoader() and Class.getClassLoader()

打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。 首先是执行Tomcat org.apache.catalina.startup.Bootstrap类,这时候的类加载器是ClassLo...
  • hanghangde
  • hanghangde
  • 2016年07月29日 10:06
  • 224

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别

查了一些资料也不是太明白两个的区别,但是前者是最安全的用法   打个简单的比方,你一个WEB程序,发布到Tomcat里面运行。 首先是执行Tomcat org.apache.catalina.s...
  • zshake
  • zshake
  • 2015年09月27日 20:23
  • 494

Thread.currentThread().getContextClassLoader().getResourceAsStream

Java路径   Java中使用的路径,分为两种:绝对路径和相对路径。具体而言,又分为四种:   一、URI形式的绝对资源路径   如:file:/D:/java/eclipse32/w...
  • z69183787
  • z69183787
  • 2014年04月02日 06:49
  • 17383

Class.getResourceAsStream(path)与Thread.currentThread().getContextClassLoader().getResourceAsStream

Class.getResourceAsStream(Path)获取的是Class类所在的package下或者工程下,例如一个Student类所在jar目录或者工程目录为D;\myapp\com\bbs...
  • bbsyhl
  • bbsyhl
  • 2016年07月28日 19:08
  • 1132

Thread.currentThread().getContextClassLoader() and Class.getClassLoader()

一、同一工程中: String path = Thread.currentThread().getContextClassLoader().getResource(".").getPath(); ...
  • liu7183296
  • liu7183296
  • 2013年10月14日 14:19
  • 387

Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()的区别

一、同一工程中: String path = Thread.currentThread().getContextClassLoader().getResource(".").getPath();  ...
  • lzy_168
  • lzy_168
  • 2013年12月12日 16:38
  • 1961

Thread.currentThread().getContextClassLoader()与Test.class.getClassLoader()区别

Java code ? 1 2 3 4 5 6 7 8 9 10 11 public class Test {       public static void main(String...
  • Truong
  • Truong
  • 2014年06月25日 14:53
  • 8079

Class.forName() 初始化、Thread.currentThread().getContextClassLoader().getResourceAsStream

Class.forName() 和 ClassLoader.loadClass()的区别? Class.forName() 和 Class.forName().NewInstance()的区别? ...
  • shanliangliuxing
  • shanliangliuxing
  • 2011年08月29日 22:20
  • 5188

读取配置文件Properties的一种方案(Thread.currentThread().getContextClassLoader() .getResourceAsStream()

Java路径   Java中使用的路径,分为两种:绝对路径和相对路径。
  • u011084726
  • u011084726
  • 2016年08月21日 14:31
  • 2512

Thread.getContextClassLoader() 祥解

答 : 这个问题经常出现在编写框架代码 , 需要动态加载很多类和资源的时候 . 通常当你需要动态加载资源的时候 , 你至少有三个 ClassLoader 可以选择 : ²        系统类加载器或...
  • Peter_K
  • Peter_K
  • 2007年06月26日 20:50
  • 7436
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
举报原因:
原因补充:

(最多只允许输入30个字)