成都互联网网站建设,杭州小程序制作公司排行榜,网络推广怎样做,做网站湖州转载自 Java高级篇——深入浅出Java类加载机制类加载器简单讲#xff0c;类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。类加载器分类从虚拟机层面讲分为两大类型的类加载器#xff0c;一是Bootstrap Classloader即启动类加载器#xff08;C实现#xff09;…转载自 Java高级篇——深入浅出Java类加载机制类加载器简单讲类加载器ClassLoader的功能就是负责将class文件加载到jvm内存。类加载器分类从虚拟机层面讲分为两大类型的类加载器一是Bootstrap Classloader即启动类加载器C实现它是虚拟机的一部分二是其他类型类加载器JAVA实现在虚拟机外部并全部继承ClassLoader类。从细分的角度讲会分为以下三类类加载器1、Bootsrap ClassLoader启动类加载器完全由jvm控制加载外面访问不到这个类加载器即不能被java程序引用。它主要负责加载jvm自身的工作类即java/lib目录和-Xbootclasspath参数指定的目录的类库。2、Extension ClassLoader扩展类加载器由java实现即ExtClassLoader实现类。它主要负责加载java/lib/ext目录和系统环境变量java.ext.dirs指定目录所有类库。3、Application ClassLoader应用程序类加载器由java实现即AppClassLoader实现类。它的父类是ExtClassLoader它主要负责加载classpath目录上的类库。如果没有自定义ClassLoader它就是程序中默认的ClassLoader即可以通过ClassLoader.getSystemClassLoader()获取当前系统的类加载器。从上图看虽然Bootstrap ClassLoader是最顶层的类加载器但是不能被程序引用它也不是ExtClassLoader的父类加载器ExtClassLoader没有父类载器我们不防来看下面简单的例子。程序首先输出了程序默认的类加载器AppClassLoader然后再输出了其父类加载器ExtClassLoader然后就完了这就证实了上面的理论。类加载机制虽然定义了上面这几个类加载器但在加载时类加载器会审查一个class类应该由哪个类型的加载器负责加载它使用的是等级加载机制是一种双亲委派模型。双亲委派模式要求所有类加载器除了顶层的Bootstrap类加载器之外都要有自己的父类加载器。在收到一个类加载请求时当前默认的类加载器它不会首先自己来加载这个类它会委托给自己的父类加载器去加载父类加载器再委托给父父类加载器以此类推直到顶层类加载器由上到下加载除非上面的类加载器都无法加载时自己才去加载。来看看ClassLoader.loadClass方法源码再回到之前文章中的有一道关于是否可以自定义类java.lang.String并使用的面试题它在java/lib目录下所以当应用类加载器去classpath加载时会去委托父类加载器这时最顶层类加载器会发现自己之前已经加载过所以这次不再加载所以自定义的这个java.lang.String虽然可以正常编译但不能被类加载器加载并使用。所以这也是双亲委派模式的好处同一个路径的类保证不能加载两次保证了类与类之间的正常行为和正常运行。