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虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
随机推荐
- fremarker导出word list
import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java ...
- 请不要在JDK7及以上用Json-lib了
[Json-lib 介绍] Json-lib 是以前 Java 常用的一个 Json 库,最后的版本是 2.4,分别提供了 JDK 1.3 和 1.5 的支持,最后更新时间是 2010年12月14日. ...
- 一文读懂四种常见的XML解析技术
之前的文章我们讲解了<XML系列教程之Schema技术_上海尚学堂java培训技术干货><XML的概念.特点与作用.XML申明_上海Java培训技术干货>,大家可以点击回顾一下 ...
- Javascript高级编程学习笔记(87)—— Canvas(4)绘制路径
绘制路径 2D上下文支持许多在画布上绘制路径的方法 通过路径可以创造出复杂的形状和线条,要绘制路径首先必须调用beginPath()方法,表示开始绘制路径 然后再通过下列的方法绘制路径: arc(x, ...
- [Swift]LeetCode748. 最短完整词 | Shortest Completing Word
Find the minimum length word from a given dictionary words, which has all the letters from the strin ...
- Python中面向对象的概念(科普)
面向对象(OOP)基本概念 面向对象编程 —— Object Oriented Programming 简写 OOP 目标 了解 面向对象 基本概念 01. 面向对象基本概念 我们之前学习的编程方式就 ...
- 面试题:反转字符串(leetcode344)
编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这一问题. 你可以 ...
- Kafka从入门到进阶
1. Apache Kafka是一个分布式流平台 1.1 流平台有三个关键功能: 发布和订阅流记录,类似于一个消息队列或企业消息系统 以一种容错的持久方式存储记录流 在流记录生成的时候就处理它们 ...
- OAuth 2.0 授权码请求
关于OAuth 2.0,请参见下面这两篇文章(墙裂推荐): <OAuth 2.0> <Spring Security OAuth 2.0> 纸上得来终觉浅,绝知此事要躬行.理论 ...
- 【Vue笔记】-- 详解vue生命周期
针对于Vue的生命周期进行详细的说明,方面加深对各个方法的引用. 引言: 前几天重新回顾vue官网时,看到vue的生命周期,想着自己用vue开发了快一年了,就总结总结vue知识,再次加深自己对vue的 ...