java类加载器

来源:互联网 发布:加工中心手动编程自学 编辑:程序博客网 时间:2024/06/07 10:58

类加载器

  1、类加载器的分类

  启动类加载器(Bootstrap ClassLoader): 主要负责加载lib目录中的,或是-Xbootclasspath参数指定的路径中的,并且可以被虚拟机识别(仅仅按照文件名识别的)的类库到虚拟机内存中。它加载的是System.getProperty("sun.boot.class.path")所指定的路径或jar。

  扩展类类加载器(Extension ClassLoader):主要负责加载libext目录中的,或者被java.ext.dirs系统变量所指定的路径中的所有类库。它加载的是

  System.getProperty("java.ext.dirs")所指定的路径或jar。

  应用程序类加载器(Application ClassLoader):也叫系统类加载器,主要负责加载ClassPath路径上的类库,如果应用程序没有自定义自己类加载器,则这个就是默认的类加载器。

  它加载的是System.getProperty("java.class.path")所指定的路径或jar。

  2、类加载器的特点

  1)运行一个程序时,总是由Application Loader(系统类加载器)开始加载指定的类。

  2)在加载类时,每个类加载器会将加载任务上交给其父,如果其父找不到,再由自己去加载。

  3)Bootstrap Loader(启动类加载器)是最顶级的类加载器了,其父加载器为null.

  3、类加载器的双亲委派模型

  类加载器双亲委派模型的工作过程是:如果一个类加载器收到一个类加载的请求,它首先将这个请求委派给父类加载器去完成,每一个层次类加载器都是如此,则所有的类加载请求都会传送到顶层的启动类加载器,只有父加载器无法完成这个加载请求(即它的搜索范围中没有找到所要的类),子类才尝试加载。

  下面是一个类加载器双亲委派模型,这里各个类加载器并不是继承关系,它们利用组合实现的父类与子类关系。

  4、类加载的几种方式

  1)命令行启动应用时候由JVM初始化加载,加载含有main的主类。

  2)通过Class.forName()方法动态加载类,默认会执行初始化块。如果指定了ClassLoader,则不会执行初始化块。

  3)通过ClassLoader.loadClass()方法动态加载类,不会执行初始化块。

  5、类加载实例

  当在命令行下执行:java HelloWorld(HelloWorld是含有main方法的类的Class文件),JVM会将HelloWorld.class加载到内存中,并在堆中形成一个Class的对象HelloWorld.class。

  基本的加载流程如下:

  1)寻找jre目录,寻找jvm.dll,并初始化JVM;

  2)产生一个Bootstrap Loader(启动类加载器);

  3)Bootstrap Loader自动加载Extended Loader(标准扩展类加载器),并将其父Loader设为BootstrapLoader。

  4)Bootstrap Loader自动加载AppClass Loader(系统类加载器),并将其父Loader设为ExtendedLoader。

  5)最后由AppClass Loader加载HelloWorld类。

0 0
原创粉丝点击