类加载器

  1)默认情况下,Java应用启动过程涉及三个ClassLoader: Boostrap CLassloder , Extension CLassloder , SystemAppClass CLassloder(Application ClassLoader)

  2)不同的类加载器加载出来的类是不一样的,不同的类加载器加载同一个类会在方法区产生两个不同的类,彼此不可见,并且在堆中生成不同的Class实例。对于接口,其实就是一个特殊的类,和类一样,在堆中产生不同的class对象。
  3)类装载器需要保证类装载过程的线程安全,因为类只加载一次。
  4)ClassLoader的父子结构中,默认装载采用了父优先(并不是真的像java中继承的关系,而是组合的关系,即在"子类"中存在一个成员变量指向"父类"的引用。(高)Bootstrap ClassLoader->Extension ClassLoader->Application ClassLoader(低))
  5)双亲委托模型的简单理解:一般对于我们java程序员来说,类的加载使用的是双亲委派模型,即当一个类需要加载时,会将类传给ApplicationClassLoader,但是ApplicationClassLoader并不会加载,不管它是否能加载,而是传给它的"父类"ExtensionClassLoader,Extension ClassLoader同样不会加载,同样传给 Bootstrap ClassLoader(注意不是我们常说的那种父类,但是可以这样理解),这时Bootstrap ClassLoader会判断它是否能加载,能加载就直接加载了,不能加载就传给ExtensionClassLoader,ExtensionClassLoader同样的判断是否能加载,能加载就直接加载,不能加载就传给ApplicationClassLoader,然后ApplicationClassLoader也判断能否加载,如果还是不能加载应该就是报ClassNotFoundException了。

原文地址:https://www.cnblogs.com/yangrongkuan/p/12028629.html