一、类的加载可以简单分成两种方式,静态加载和动态加载。

  1、静态加载,就是new等方式使用到一个类的实例时,程序在运行到该处时,会把该类的.class文件加载到jvm里。

  2、动态加载,通过Class.forName()或类加载器的方式,通过类的全名限定把.class文件加载到jvm里。

    forName()方式:

    @Test
public void testClass() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Emp emp = (Emp) Class.forName("entity.Emp").newInstance();
System.out.println(emp);
}

    结果:

Emp [name=null, age=0, address=null, date=null]

    类加载的方式:需要一个ClassLoader的实例,运行它的loadClass()方法,一般使用本类的类加载,或自定义类的加载器。  

@Test
public void testClassLoader() throws InstantiationException, IllegalAccessException, ClassNotFoundException {
//本类的类加载器使用方式
ClassLoader thisLoader = this.getClass().getClassLoader();
Emp empOne = (Emp) thisLoader.loadClass("entity.Emp").newInstance();
System.out.println(empOne); //其他类的使用
ClassLoader classLoader = Emp.class.getClassLoader();
Emp empTwo = (Emp) classLoader.loadClass("entity.Emp").newInstance();
System.out.println(empTwo);
}

    结果:

Emp [name=null, age=0, address=null, date=null]
Emp [name=null, age=0, address=null, date=null]

二、类加载的机制

  类加载器的层次关系:

  *仅仅是层次关系,非继承关系

  *它并不是一个强制性的约束模型,而是Java设计者推荐给开发者的一种类加载器实现方式

  

  启动类加载器  Bootstrap ClassLoader

    ↑

  扩展类加载器  Extension ClassLoader

    ↑

  应用程序类加载器  Application ClassLoader

    ↑

  自定义类加载器  Custom ClassLoader

  

1、启动类加载器Bootstrap ClassLoader

  这是一个嵌在JVM内核中的加载器。它负责加载的是JAVA_HOME/lib下的类库,系统类加载器无法被Java程序直接应用

2、扩展类加载器Extension ClassLoader

  这个类加载器由sun.misc.Launcher$ExtClassLoader实现,它负责用于加载JAVA_HOME/lib/ext目录中的,或者被java.ext.dirs系统变量指定所指定的路径中所有类库,开发者可以直接使用扩展类加载器。java.ext.dirs系统变量所指定的路径的可以通过程序来查看

    @Test
public void testdirs() {
System.out.println(System.getProperty("java.ext.dirs"));
}

  结果:

D:\java\jdk1.8.0_91\jre\lib\ext;C:\Windows\Sun\Java\lib\ext

3、应用程序类加载器Application ClassLoader

这个类加载器由sun.misc.Launcher$AppClassLoader实现。这个类也一般被称为系统类加载器,会加载java.class.path下的类文件。

这个目录包括了项目中类的.class问价,即编译后项目的bin目录,和项目引用的第三发jar包或通过maven引用的jar包等。

    @Test
public void testdirs() {
System.out.println(System.getProperty("java.class.path"));
}

  结果:

D:\git\basicCode\bin;C:\Users\lizihao\.p2\pool\plugins\org.junit_4.12.0.v201504281640\junit.jar;C:\Users\lizihao\.p2\pool\plugins\org.hamcrest.core_1.3.0.v20180420-1519.jar;D:\git\basicCode\jar\commons-io-2.5.jar;D:\git\basicCode\jar\dom4j-1.6.1.jar;D:\git\basicCode\jar\sqljdbc42.jar;D:\git\basicCode\jar\ojdbc6.jar;D:\git\basicCode\jar\json-20160810.jar;D:\git\basicCode\jar\itextpdfjar\barcodes-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\font-asian-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\forms-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\hyph-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\io-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\kernel-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\layout-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\pdfa-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\sign-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\styled-xml-parser-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\svg-7.1.4.jar;D:\git\basicCode\jar\itextpdfjar\slf4j-api-1.7.13.jar;D:\git\basicCode\jar\mysql-connector-java-5.1.47.jar;D:\java\eclipse\eclipse\configuration\org.eclipse.osgi\417\0\.cp;D:\java\eclipse\eclipse\configuration\org.eclipse.osgi\416\0\.cp

类加载器:

    @Test
public void testdirs() {
System.out.println(this.getClass().getClassLoader());
System.out.println(this.getClass().getClassLoader().getParent());
System.out.println(this.getClass().getClassLoader().getParent().getParent());
}

  结果:

sun.misc.Launcher$AppClassLoader@60e53b93
sun.misc.Launcher$ExtClassLoader@27c170f0
null

从结果可以看出来,我自定义的测试类的使用的是应用程序类加载器Application ClassLoader,它的父类加载器(非继承意义上的父类)是扩展类加载器Extension ClassLoader,而在往上的启动类加载器Bootstrap ClassLoader是null,因为jvm的一部分,是c/c++写的,所以没有保存在java堆中,其他加载器都是java实现的,类型信息class实例保存在java堆中,虽有可以打印出来。

三、类加载双亲委派机制

  

java虚拟机的类加载器的更多相关文章

  1. JAVA虚拟机之类加载器

    转载请声明:原文转自http://www.cnblogs.com/xiezie/p/5909570.html 1.JVM的生命周期 1.1 JVM的生命周期和程序的生命周期一致 1.2 JVM结束生命 ...

  2. Hotspot Java虚拟机的类加载器

    从Java虚拟机角度来讲,有两种类加载器.1.启动类加载器.(Bootstrap ClassLoader,C++)2.所有其他类加载器.(Java,java.lang.ClassLoader) 系统提 ...

  3. 【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载

    类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能出现相 ...

  4. 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)

    前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...

  5. 黑马程序员——【Java高新技术】——类加载器

    ---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...

  6. 深入理解java虚拟机【类加载机制】

    Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...

  7. Java中的类加载器

    转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制   我们知道,Java是一种动态语言.那么怎 ...

  8. Java中的类加载器以及Tomcat的类加载机制

    在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...

  9. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

随机推荐

  1. android颜色color.xml设置

     XML Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  2. 逆天的 GRUB

    参考资料 GRUB 的文档在这里:https://www.gnu.org/software/grub/manual/grub/ Linux 的启动过程和 GRUB 的地位 Linux 系统启动的过程是 ...

  3. 仿微信的IM聊天时间显示格式(含iOS/Android/Web实现)[图文+源码]

    本文为原创分享,转载请注明出处. 1.引言 即时通讯IM应用中的聊天消息时间显示是个再常见不过的需求,现在都讲究用户体验,所以时间显示再也不能像传统软件一样简单粗地暴显示成“年/月/日 时:分:秒”这 ...

  4. CSS怎么在项目里引入自定义字体(@font-face)

    前言: 以前我一直用内置的默认字体给文字设置字体,直到一天UI妹纸给了我下面的字体    当时我是蒙蔽的,这个字体的效果如下 默认字体并无该字体,直接设置是没有效果的,这时就需要用到自定义字体了 下面 ...

  5. [Swift]LeetCode944. 删除列以使之有序 | Delete Columns to Make Sorted

    We are given an array A of N lowercase letter strings, all of the same length. Now, we may choose an ...

  6. [Swift]LeetCode1002. 查找常用字符 | Find Common Characters

    Given an array A of strings made only from lowercase letters, return a list of all characters that s ...

  7. 微信公众号订阅号以及服务号通过网页授权获取用户openid方法

    微信官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 官方流程 网页授权流程分为四步: 1.引导用户 ...

  8. 第2章 Java编程基础

    本章重点 ·Java的基本语法形式 ·Java语言中的常量与变量 ·Java语言运算符的使用 ·Java程序的流程控制 ·Java中方法的定义与使用 ·Java中数组的定义与使用 2.1 Java的基 ...

  9. [Reversing.kr] Easy ELF Writeup

    IDA打开,看到main()函数,当sub_8048451() 返回1 是flag正确. 跟踪函数. 脚本: #!usr/bin/env python #!coding=utf-8 __author_ ...

  10. Hadoop源码篇--Reduce篇

    一.前述 Reduce文件会从Mapper任务中拉取很多小文件,小文件内部有序,但是整体是没序的,Reduce会合并小文件,然后套个归并算法,变成一个整体有序的文件. 二.代码 ReduceTask源 ...