类装载器

原创 2018年04月15日 13:55:07

class装载验证流程

加载

装载类的第一个阶段
取得类的二进制流
转为方法区数据结构
在Java堆中生成对应的java.lang.Class对象

链接

——验证

目的:保证Class流的格式是正确的
-文件格式的验证
是否以0xCAFEBABE开头
版本号是否合理
-元数据验证
是否有父类
继承了final类?
非抽象类实现了所有的抽象方法
-字节码验证 (很复杂)
运行检查
栈数据类型和操作码数据参数吻合
跳转指令指定到合理的位置
-符号引用验证
常量池中描述类是否存在
访问的方法或字段是否存在且有足够的权限

——准备

-分配内存,并为类设置初始值 (方法区中)
public static int v=1;
在准备阶段中,v会被设置为0
在初始化的<clinit>中才会被设置为1
对于static final类型,在准备阶段就会被赋上正确的值
public static final  int v=1;

——解析

-符号引用替换为直接引用

初始化

-执行类构造器<clinit>
static变量 赋值语句
static{}语句
-子类的<clinit>调用前保证父类的<clinit>被调用
-<clinit>是线程安全的

什么是类装载器ClassLoader

ClassLoader是一个抽象类
ClassLoader的实例将读入Java字节码将类装载到JVM中
ClassLoader可以定制,满足不同的字节码流获取方式
ClassLoader负责类装载过程中的加载阶段

JDK中ClassLoader默认设计模式

ClassLoader的重要方法
public Class<?> loadClass(String name) throws ClassNotFoundException
载入并返回一个Class
protected final Class<?> defineClass(byte[] b, int off, int len)
定义一个类,不公开调用
protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass回调该方法,自定义ClassLoader的推荐做法
protected final Class<?> findLoadedClass(String name) 
寻找已经加载的类
BootStrap ClassLoader (启动ClassLoader)
Extension ClassLoader (扩展ClassLoader)
App ClassLoader (应用ClassLoader/系统ClassLoader)
Custom ClassLoader(自定义ClassLoader)
每个ClassLoader都有一个Parent作为父亲

热替换

当一个class被替换后,系统无需重启,替换的类立即生效

DoopRun 不停调用CVersionA . sayHello()方法,因此有输出:hello world! (version A)
在DoopRun 的运行过程中,替换CVersionA 为:

public class CVersionA {
	public void sayHello() {
		System.out.println("hello world! (version B)");
	}
}
替换后, DoopRun 的输出变为
hello world! (version B)

类装载器学习笔记

        java虚拟机(JVM)的类装载就是将包含在类文件中的字节码装载到java虚拟机里来,但是类装载器也不是原封不动的装载到java虚拟机,它是将(.class)文件中的内容转换成java...
  • wongda2008
  • wongda2008
  • 2006-08-25 20:21:00
  • 1746

java类装载器分析

1           前言ClassLoader 是 Java 虚拟机 (JVM) 的类装载子系统,它负责将 Java 字节码装载到 JVM 中, 并使其成为 JVM 一部分。 JVM 的类动态装载...
  • chjttony
  • chjttony
  • 2010-11-16 16:33:00
  • 2441

类装载器体系结构

本文摘自:《深入java虚拟机(第二版)》 在Java 沙箱中,类装载器体系结构是第一道防线。因为是由类装载器将代码(这个代码可能是恶意的或是有漏洞的)装人Java虚拟机中。类装载器体系结构在三...
  • u011630575
  • u011630575
  • 2015-10-08 21:45:53
  • 390

java类装载器学习一、类加载器的基本概念

  • 2013年05月06日 19:09
  • 188KB
  • 下载

使用ClassLoader类装载器获取系统资源

/*  ClassLoader 有两种方法获得系统资源,一个种静态方法,一种是实例方法。  静态方法:  URL getSystemResource(String)  InputStr...
  • u010015108
  • u010015108
  • 2016-07-25 16:52:27
  • 332

类装载器

jvm主要有三部分组成:类装载器,类校验器和类解释器。jvm对于每一个要使用的类首先的任务就是要将类的字节码数据装载进来 ,完成类的装载的功能的就是类装载器。类装载器根据要装载的类的类名来定位和装载类...
  • dongguang1082
  • dongguang1082
  • 2009-05-14 15:24:00
  • 368

Java类加载器 以及类加载器的委托模型

我们知道 我们在Java中用到的所有的类都是通过类加载器ClassLoader加载到JVM中的,我们还知道  类加载器 也对应着一个类 ,既然这样那么我们会想 那么ClassLoader类是由谁加载的...
  • yue7603835
  • yue7603835
  • 2012-02-08 22:53:17
  • 1710

读javaWeb开发记录-类装载器

以前对类装载器总是一个模糊的概念,它是如何工作的,实现的机制是什么等等。今天看书刚好看到这一点,就索性记录下来吧。jvm主要有三部分组成:类装载器,类校验器和类解释器。jvm对于每一个要使用的类首先的...
  • hnsc
  • hnsc
  • 2006-11-23 18:05:00
  • 642

java程序读取资源文件

在servlet中通过servletContext读取资源文件,那么在非servlet中可以通过类装载器读取资源文件。 在src目录下编写数据库资源文件:db.propertiesurl=jdbc:...
  • syf1970
  • syf1970
  • 2016-06-17 20:53:15
  • 221

知识回顾10、类装载器学习一、类加载器的基本概念

类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Ja...
  • LonelyRoamer
  • LonelyRoamer
  • 2012-05-21 09:54:08
  • 1760
收藏助手
不良信息举报
您举报文章:类装载器
举报原因:
原因补充:

(最多只允许输入30个字)