java底层学习ITeye - 娱乐之横扫全球

java底层学习ITeye

2019-01-13 13:10:38 | 作者: 笑天 | 标签: 加载,底层,咱们 | 浏览: 430

 

咱们经过自界说的类加载器完结了 TestClassA 类的加载并调用 method ()办法。剖析一下这个程序:首要界说 URL 指定类加载器从何处加载类, URL 能够指向网际网络上的任何方位,也能够指向咱们计算机里的文件系统 ( 包括 JAR 文件 ) 。上述典范傍边咱们从 file:/d:/test/lib/ 处寻觅类;然后界说 URLClassLoader 来加载所需的类,最终即可运用该实例了。

 

4. 类加载器的阶级系统

评论了这么多今后,接下来咱们细心研究一下 Java 的类加载器的作业原理:

当履行 java ***.class 的时分, java.exe 会协助咱们找到 JRE ,接着找到坐落 JRE 内部的 jvm.dll ,这才是真实的 Java 虚拟机器 , 最终加载动态库,激活 Java 虚拟机器。虚拟机器激活今后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完结之后,就会发作第一个类加载器―― Bootstrap Loader , Bootstrap Loader 是由 C++ 所编撰而成,这个 Bootstrap Loader 所做的初始作业中,除了一些根本的初始化动作之外,最重要的就是加载 Launcher.java 之中的 ExtClassLoader ,并设定其 Parent 为 null ,代表其父加载器为 BootstrapLoader 。然后 Bootstrap Loader 再要求加载 Launcher.java 之中的 AppClassLoader ,并设定其 Parent 为之前发作的 ExtClassLoader 实体。这两个加载器都是以静态类的方式存在的。这儿要请咱们留意的是, Launcher$ExtClassLoader.class 与Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所加载,所以 Parent 和由哪个类加载器加载没有联络。

下面的图形能够表明三者之间的联络:

父类

父类

载入

载入

BootstrapLoader

       PARENT

AppClassLoader

PARENT

ExtClassLoader

这三个加载器就构成咱们的 Java 类加载系统。他们分别从以下的途径寻觅程序所需求的类:

BootstrapLoader :      sun.boot.class.path

ExtClassLoader:                java.ext.dirs

AppClassLoader:               java.class.path

这三个系统参量能够经过 System.getProperty() 函数得到详细对应的途径。咱们能够自己编程完结检查详细的途径。

 

5. 总结

了解 Java 的类加载机制对咱们娴熟灵活运用 Java 言语,进步程序的运转功率有着非常重要的效果,知其然也要知其所以然,这样才能从全体进步程序的质量。

 

4.深化java底层

http://bigwhite.blogbus.com/logs/579744.html

 

在一个朋友的书架上发现王森著的《Java深度历险》一书,看了书的前语了解该书是关于Java底层技能内情的。怀着好奇心阅读了一下,谈不上有太多收成,但也记下了一些自认为有利的两点。

Java xxx

咱们在命令行下敲入:“java xxx”后会发作什么呢?

流程如下:

 

1.        找到JRE;

 

2.        找到JVM.dll;

 

3.        发动JVM,并进行初始化;

 

4.        发作Bootstrap Loader;

 

5.        载入ExtClassLoader;(Ext – Extended)

 

6.        载入AppClassLoader;

 

7.        加载xxx类。

 

书中说到Bootstrap Loader、ExtClassLoader和AppClassLoader构成了Java的“类加载器承继系统--class loader hierarchy”,其间BootstrapLoader是由C++编写的,其他两个是由Java写的。之所以成为“承继系统”是因为这三个loader之间是有联络的。Bootstrap Loader担任加载ExtClassLoader,后者ExtClassLoader就将其parent置为Bootstrap Loader。AppClassLoader较为特别,尽管由Bootstrap载入,可是其parent却置为ExtClassLoader。其原因是为了完结“托付模型”。简述“托付模型”就是当类加载器有加载类的需求时,会先恳求其parent运用其查找途径协助加载,假如其parent找不到,才运用自己的查找途径进行加载。如上述所说当ExtClassLoader想载入AppClassLoader类时它首要恳求其parent “Bootstrap Loader”帮助,Bootstrap Loader将AppClassLoader载入后,因为这个载入是ExtClassLoader恳求的,所以AppClassLoader的parent仍是置为ExtClassLoader而不是Bootstrap Loader。

类的加载流程

类加载的时分遵从一个准则:“类加载器会依类的承继系统从上至下顺次加载”。举个比如:“假如C承继了B并完结了接口I,而B有承继自A”,则类加载器在加载C时,加载的次第会是A- B- I- C,(注:interface会好像class相同被Java编译器编译为独立的.class文件)

其实我对底层的东西并未给与太多的重视,假如在哪个项目中需求我去了解底层的话,我会去很好的学习。

 

额,趁便看看什么事DLL

http://baike.baidu.com/view/887.htm

动态链接库英文为DLL,是DynamicLink Library 的缩写方式,DLL是一个包括可由多个程序一起运用的代码和数据的库,DLL不是可履行文件。动态链接供给了一种办法,使进程能够调用不属于其可履行代码的函数。函数的可履行代码坐落一个 DLL 中,该 DLL 包括一个或多个已被编译、链接并与运用它们的进程分隔存储的函数。DLL 还有助于同享数据和资源。多个应用程序可一起拜访内存中单个DLL 副本的内容。DLL 是一个包括可由多个程序一起运用的代码和数据的库。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表娱乐之横扫全球立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章