首页 存档 技术 查看内容

Java 基础中一些值得聊的话题( 加载篇 )

2018-3-30 13:00 |来自: 互联网 267 0

摘要: 来源:笨狐狸 blog.csdn.net/liweisnake/article/details/17842877 在开始Java的类加载旅程之前,可以先参考这里了解一些类加载器在Tomcat中的应用(http://blog.csdn.net/liweisnake/article/details/8470285)。 ...

来源:笨狐狸

blog.csdn.net/liweisnake/article/details/17842877


在开始Java的类加载旅程之前,可以先参考这里了解一些类加载器在Tomcat中的应用(http://blog.csdn.net/liweisnake/article/details/8470285)。


在最初执行java这个命令时,便会调用 ClassLoader 的 getSystemClassLoader 方法显式或者隐式加载 main 方法所在的类及其所引用的类。getSystemClassLoader 会返回 AppClassLoader,后者是 URLClassLoader 的一个子类。


先有鸡还是先有蛋?


所以,最初的一个问题是:先有鸡还是先有蛋?因为 ClassLoader 的整套体系是打包在 jre/lib/rt.jar 中的。只有 rt.jar 先被加载进来,才能够加载别的类;但是 rt.jar 又是被谁加载的呢?自然就是大名鼎鼎的 BootstrapClassLoader。它就是“鸡”。所以严格来讲,BootStrapClassLoader 并不是整个体系中的一部分(可以用 -Xbootclasspath 指定bootstrap 加载的位置)。


当 rt.jar 被加载进来后,ClassLoader 会调用 getSystemClassLoader,其中最重要的一步就是初始化 Launcher、ExtClassLoader 以及AppClassLoader,另外就是将 ContextClassLoader 设为 AppClassLoader。ExtClassLoader 与 AppClassLoader 都是 URLClassLoader 的子类,分别会加载 java.ext.dirs 和 java.class.path 路径下的 jar资源,前者一般指向 jre/lib/ext 下的所有jar,后者就是我们经常念叨的classpath。区分这两个 ClassLoader 的主要目的是,让他们形成层级关系,ExtClassLoader 为 AppClassLoader 的父 ClassLoader,有了层级关系,便可随意使用双亲委托模型了。


ClassLoader extcl;

try {

extcl = ExtClassLoader.getExtClassLoader();

} catch (IOException e) {

throw new InternalError(

"Could not create extension class loader");

}

// Now create the class loader to use to launch the application

try {

loader = AppClassLoader.getAppClassLoader(extcl);

} catch (IOException e) {

throw new InternalError(

"Could not create application class loader");

}

// Also set the context class loader for the primordial thread.

Thread.currentThread().setContextClassLoader(loader);


ClassLoader究竟干了什么?


接下来一个比较重要的问题是ClassLoader究竟干了什么?通常我们只知道它加载了一个类进了jvm,但是具体做了什么呢?


Java设计者把classloader加载一个类的过程分为4步:


  • 第一步,从某个地方得到我们想要的字节码二进制流;

  • 第二步,读入字节码流并转化为Class;

  • 第三步,链接;

  • 第四步,初始化。


其中,第二步一般比较固定,因此ClassLoader提供了defineClass来完成这步;


protected final Class

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部