java虚拟机的类加载器
一、类的加载可以简单分成两种方式,静态加载和动态加载。
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虚拟机的类加载器的更多相关文章
- JAVA虚拟机之类加载器
转载请声明:原文转自http://www.cnblogs.com/xiezie/p/5909570.html 1.JVM的生命周期 1.1 JVM的生命周期和程序的生命周期一致 1.2 JVM结束生命 ...
- Hotspot Java虚拟机的类加载器
从Java虚拟机角度来讲,有两种类加载器.1.启动类加载器.(Bootstrap ClassLoader,C++)2.所有其他类加载器.(Java,java.lang.ClassLoader) 系统提 ...
- 【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载
类加载器的命名空间 每个类加载器又有一个命名空间,由其以及其父加载器组成 类加载器的命名空间的作用和影响 每个类加载器又有一个命名空间,由其以及其父加载器组成 在每个类加载器自己的命名空间中不能出现相 ...
- 深入理解JVM(③)虚拟机的类加载器(双亲委派模型)
前言 先解释一下什么是类加载器,通过一个类的全限定名来获取描述该类的二进制字节流,在虚拟机中实现这个动作的代码被称为"类加载器(Class Loader)". 类与类加载器 类加载 ...
- 黑马程序员——【Java高新技术】——类加载器
---------- android培训.java培训.期待与您交流! ---------- 一.概述 (一)类加载器(class loader) 用来动态加载Java类的工具,它本身也是Java类. ...
- 深入理解java虚拟机【类加载机制】
Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需要完成以下 ...
- Java中的类加载器
转载:http://blog.csdn.net/zhangjg_blog/article/details/16102131 从java的动态性到类加载机制 我们知道,Java是一种动态语言.那么怎 ...
- Java中的类加载器以及Tomcat的类加载机制
在加载阶段,虚拟机需要完成以下三件事情: 1.通过一个类的全限定名来获取其定义的二进制字节流. 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构. 3.在Java堆中生成一个代表这个类 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
随机推荐
- C语言面试题分类->排序算法
1.选择排序. 每次将最小的数,与剩余数做比较.找到更小的,做交换. 时间复杂度:O(n²) 空间复杂度:O(1) 优缺点:耗时但内存空间使用小. void selectSort(int *p,int ...
- [AI开发]Python+Tensorflow打造自己的计算机视觉API服务
"与其停留在概念理论层面,不如动手去实现一个简单demo ." ——鲁迅 没有源码都是耍流氓github 前言 目前提供AI开发相关API接口的公司有很多,国外如微软. ...
- WinRAR存在严重的安全漏洞影响5亿用户
WinRAR可能是目前全球用户最多的解压缩软件,近日安全团队发现并公布了WinRAR中存在长达19年的严重安全漏洞,这意味着有可能超过5亿用户面临安全风险. 该漏洞存在于所有WinRAR版本中包含的U ...
- CentOS安装gcc clang git mysql等软件高版本福利
最近同事需要在单位提供的开发机上临时安装gcc等软件,时间紧迫,因此向其推荐安装福利devtoolset. 感谢devtoolset,使得CentOS软件安装无比的快捷,卸载也是无与伦比的简单. gc ...
- 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis ...
- Spring介绍
Spring介绍 Spring的核心是一个轻量级(Lightweight)的容器(Container),它是实现IoC(Inversion of Control)容器和非入侵性(No intrusiv ...
- MySQL优化配置之query_cache_size
原理MySQL查询缓存保存查询返回的完整结果.当查询命中该缓存,会立刻返回结果,跳过了解析,优化和执行阶段. 查询缓存会跟踪查询中涉及的每个表,如果这写表发生变化,那么和这个表相关的所有缓存都将失效 ...
- 【从零开始自制CPU之学习篇04】电容
电解电容: 多数在1μF以上,直接用数字表示.如:4.7μF.100μF.220μF等等.这种电容的两极有正负之分,长脚是正极. 独石电容: 独石电容器是多层陶瓷电容器的别称, 简称MLCC 读数方法 ...
- 【从零开始自制CPU之学习篇02】555定时器
555定时器是一种集成电路芯片,常被用于定时器.脉冲产生器和震荡电路.在CPU制作中作为pc(程序计数器)的主要组成部分.以下是我购买的NE555实拍图: NE555的针脚示意图: 555定时器各针脚 ...
- solr之环境配置二
安装配置Tomcat 下载Tomcat压缩包 我下载的是7.0.55版本. 1.Tomcat 7.0 的免安装版的配置(假如将Tomcat 解压到C:\Program Files目录,目录结构为:C: ...