类装载器-ClassLoader
类装载器的工作机制
类装载器就是寻找类的字节码文件并构造出类在JVM内部表示对象的组件。在Java中,类装载器把一个类装入JVM中,需要经过以下步骤:
- 装载:查找和导入Class文件。
- 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的。
- 校验:检查载入Class文件数据的正确性。
- 准备:给类的静态变量分配存储空间。
- 解析:将符号引用转换成直接引用。
- 初始化:对类的静态变量、静态代码块执行初始化工作。
类装载工作由ClassLoader及其子类负责。ClassLoader是一个重要的Java运行时系统组件,它负责在运行时查找和装入Class字节码文件,JVM在运行会产生3个ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和AppClassLoader(应用类装载器)。其中,根装载不是ClassLoader的子类,它使用C++语言编写,因而在Java中看不到它,根装载器负责装载JRE的核心类库,如JRE目标下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子类,其中ExtClassLoader负责装载JRE扩展目录ext中的JAR类包;AppClassLoader负责装载Classpath路径下的类包。
这3个类装载器之间存在父子层级关系,即根装载器是ExtClassLoader的父装载器,ExtClassLoader是AppClassLoaderde父装载器。在默认情况下,使用AppClassLoader装载应用程序的类。
JVM装在类时使用"全盘负责委托机制","全盘负责"是指当一个ClassLoader装载一个类时,除非显式地使用另一个ClassLoader,该类所依赖及引用也由这个ClassLoader载入;"委托机制"是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径下查找并装载目标类。这一点是从安全角度考虑的。
ClassLoader的重要方法
在Java中,ClassLoader是一个抽象类,位于java.lang包中。下面对该类的一些重要接口方法进行介绍。
- Class loadClass(String name): name参数指定类装载器需要装载类的名字,必须使用全限定类名。该方面有一个重载方法loadClass(String name,boolean resolve),resolve参数告诉装载器是否需要解析该类,在初始化类之前,应考虑进行类解析的工作,但并不是所有的类都需要解析该类。如果JVM只需要知道该类是否存在或找出该类的超类,那么就不需要进行解析。
- Class definClass(String name,byte[] b,int off,int len): 将类文件的字节数组转换成JVM内部的java.lang.Class对象,字节数组可以从本地文件系统、远程网络获取。参数name为字节数组对应的全限定类名。
- Class findSystemClass(String name):从本地文件系统载入Class文件。如果本地文件系统不存在该Class文件,则将抛出ClassNotFoundException异常,该方法是JVM默认使用的装载机制。
- CLass findLoadedClass(String name): 调用该方法来查看ClassLoader是否已经装入某个类。如果已装入,那么返回java.lang.Class对象;否则返回null,如果强行装载已存在的类,那么将会抛出链接错误。
- ClassLoader getParent():获取类装载器的父装载器。除根装载器外,所有的类装载器有且仅有一个父装载器。ExtClassLoader的父装载器是根装载器,因为根装载器非Java语言编写,所以无法获得,将返回null。
类装载器-ClassLoader的更多相关文章
- 类装载器ClassLoader
类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件: [2.]链接 ...
- Java类装载器ClassLoader
类装载器工作机制 类装载器就是寻找类的节码文件并构造出类在JVM内部表示对象的组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: [1.]装载:查找和导入Class文件: [2.]链接 ...
- 深度分析 Java 的 ClassLoader 机制(源码级别)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...
- 深度分析Java的ClassLoader机制(源码级别)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...
- 深度分析 Java 的 ClassLoader 机制(源码级别)(转)
写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoa ...
- java 反射 类装载器
前言: java语言允许通过程序化的方式间接对Class进行操作,Class文件由类装载器装载后,在jvm中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息,如构 ...
- 【JVM】深度分析Java的ClassLoader机制(源码级别)
原文:深度分析Java的ClassLoader机制(源码级别) 为了更好的理解类的加载机制,我们来深入研究一下ClassLoader和他的loadClass()方法. 源码分析 public abst ...
- 理解不为人知的ClassLoader
JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中. 2.显式装载, 通过class.forname()等方法,显 ...
- Servlet学习(二):ServletConfig获取参数;ServletContext应用:请求转发,参数获取,资源读取;类装载器读取文件
转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件 ...
随机推荐
- Eureka控制台参数说明
1.HOME进入Eureka控制台首页,首先看HOME页的头部System StatusEnvironment: 环境,默认为test,该参数在实际使用过程中,可以不用更改Data center: 数 ...
- 模型评估——ROC、KS
无论是利用模型对信用申请人进行违约识别,还是对授信申请人进行逾期识别……在各种各样的统计建模中,永远必不可少的一步是对模型的评价,这样我们就可以根据模型评价指标的取值高低,来决定选取哪个模型.本篇主要 ...
- solr入门
Solr采用Lucene搜索库为核心,提供全文索引和搜索开源企业平台,提供REST的HTTP/XML和JSON的API,如果你是Solr新手,那么就和我一起来入门吧!本教程以solr4.8作为测试环境 ...
- 开源网站流量统计系统Piwik源码分析——后台处理(二)
在第一篇文章中,重点介绍了脚本需要搜集的数据,而本篇主要介绍的是服务器端如何处理客户端发送过来的请求和参数. 一.设备信息检测 通过分析User-Agent请求首部(如下图红线框出的部分),可以得到相 ...
- XML部分
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式? 两种形式:DTD以及schema: 本质区别:schema本身是xml的,可以被XML解析器解析(这也是从DTD上发展sc ...
- 钉钉接口:获取accessToken和打卡记录【分享】
post和get方法工具类:HttpUtils package weaver.dingtalk.utils; import com.alibaba.fastjson.JSONObject; impor ...
- MVC中子页面如何引用模板页中的jquery脚本
MVC中子页面如何引用模板页中的jquery脚本 最近在学习mvc,遇到了一个问题:在html页面中写js代码,都是引用mvc5自带的jquery脚本,虽然一拖(将指定的jquery脚本如 jquer ...
- Linux中重命名乱码文件
Linux下,如何将一个乱码的文件进行重命名 方法一: 命令格式:mv $(ls |egrep "[^a-zA-Z0-9.-]") tandao.tx [root@nb o]# l ...
- foreach 引发的值类型与引用类型思考
用都知道的一句话概括:“引用类型在堆上,栈上只保存引用:值类型即可存放于栈上也可存放于堆上,值类型变量直接存储值本身”. class Program { static void Main(string ...
- 原生JS强大DOM选择器querySelector与querySelectorAll
在传统的 JavaScript 开发中,查找 DOM 往往是开发人员遇到的第一个头疼的问题,原生的 JavaScript 所提供的 DOM 选择方法并不多,仅仅局限于通过 tag, name, id ...