类加载的过程——加载。

标签: jvm
6人阅读 评论(0) 收藏 举报
分类:

        “加载”是“类加载”(Class Loading)过程的一个阶段。在加载阶段,虚拟机需要完成以下3件事情:

  1. 通过一个类的全限定名来获取定义此类的二进制字节流。
  2. 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。
  3. 在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。

        虚拟机规范的这3点要求其实并不算具体,因此虚拟机实现与具体应用的灵活度都是相当大的。例如“通过一个类的全限定名来获取定义此类的二进制字节流”这条,他没有指明二进制字节流要从一个Class文件中获取,准确的说是根据没有指明要从哪里获取、怎样获取。虚拟机设计团队在加载阶段搭建了一个相当开放的、广阔的“舞台”,Java发展历史中,充满创造力的开发人员则在这个“舞台”上玩出了各种各样,许多举足轻重的Java技术都建立在这一基础之上,例如:

  • 从ZIP包中读取,这很常见,最终称为日后JAR、EAR、WAR格式的基础。
  • 从网络中获取,这汇总场景最典型的应用就是Applet。
  • 运行时计算生成,这种场景使用得最多的就是动态代理技术,在java.lang.reflect.Proxy中,就是用了ProxyGenerator.generateProxyClass来为特定接口生成形式为“$Proxy”的代理类的二进制字节流。
  • 由其他文件生成,典型场景是JSP应用,即由JSP文件生成对应的Class类。
  • 从数据库中读取,这种场景相对少见些,例如有些中间件服务器(如SAP Netweaver)可以选择把程序安装到数据库中来完成程序代码在集群间的分发。

 ......

        相对于类加载过程的其他阶段,一个非数组类的加载阶段(准确的说,是加载阶段中获取类的二进制字节流的动作)是开发人员可控性最强的,因为加载阶段即可以使用系统提供的引导类加载器来完成,也可以由用户自定义的类加载器去完成,开发人员可以通过定义自己的类加载器去控制字节流的获取方式(即重写一个类加载器的loadClass()方法)。

        对于数组类而言,情况就有所不同,数组类本身不通过类加载器创建,他是由Java虚拟机直接创建的。但数组类与类加载器仍然有很密切的关系,因为数组类的元素类型(Element Type,指的是数组去掉所有维度的类型)最终是要靠类加载器去创建,一个数组类(下面简称为C)创建过程就遵循以下规则:

  • 如果数组的组件类型(Component Type,指的是数组去掉一个维度的类型)是引用类型,那就递归采用本文中定义的加载过程去加载这个组件类型,数组C在加载该组件类型的类加载器的类名称空间上被标识(这点很重要,一个类必须与类加载器一起确定唯一性)。
  • 如果数组的组件类型不是引用类型(例如int[]数组),Java虚拟机将会把数组C标记为与引导类加载器相关。
  • 数组类的可见性与他的组件类型的可见性一致,如果组件类型不是引用类型,那数组类的可见性将默认为public。

        加载阶段完成后,虚拟机外部的二进制字节类就按照虚拟机所需的格式存储在方法区之中,方法区中的数据存储格式由虚拟机实现自行定义,虚拟机规范未规定此区域的具体结构。然后在内存中实例化一个java.lang.Class类的对象(并没有明确规定是在Java堆中,对于HotSpot虚拟机而言,Class对象比较特殊,他虽然是对象,但是存放在方法区里面),这个对象将作为程序访问方法区中的这些类型数据的外部接口。

        加载阶段与连接阶段的部分内容(如一部分字节码文件格式验证工作)是交叉进行的,加载阶段尚未完成,连接阶段可能已经开始,但这些夹在加载阶段之中进行的动作,仍然属于连接阶段的内容,这两个阶段的开始时间仍然保持着固定的先后顺序。

查看评论

Java中类加载过程和对象创建过程

类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加...
  • u014338577
  • u014338577
  • 2015-11-21 21:47:26
  • 6106

JAVA 类加载过程详细讲解 -jvm加载类机制CLass Loading

jvm加载类机制CLass Loading
  • tangdong3415
  • tangdong3415
  • 2016-12-20 20:02:36
  • 8512

JAVA虚拟机(JVM)——类加载的过程(加载、验证、准备、解析、初始化)

加载“加载”是”类加载”过程的一个阶段。在加载阶段,虚拟机需要完成以下3件事情:1.通过一个类的全限定名来获取定义此类的二进制字节流。 2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构...
  • chenge_j
  • chenge_j
  • 2017-05-24 16:39:40
  • 1126

JAVA中类的加载过程

java中类的加载过程
  • sinat_19650093
  • sinat_19650093
  • 2016-03-20 21:56:51
  • 5625

静态类加载过程、对象的创建过程

类加载的过程: 1、当在程序中要使用某个类的时候,JVM 会先在当前的方法区中找有没有这个class文件信息,如果没有这时JVM会先去加载这个class文件 2、加载的时候,如果配置了classp...
  • mid120
  • mid120
  • 2016-12-16 18:06:15
  • 623

【JVM】类加载、连接和初始化过程

程序运行时,加载类主要经过3个阶段分别是类的加载,连接和初始化。分别介绍一下这三个过程。 一、加载类的加载指的是将类的.class文件中二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆...
  • wangyy130
  • wangyy130
  • 2016-08-04 14:35:30
  • 1704

JVM类生命周期概述:加载时机与加载过程

一个.java文件在编译后会形成相应的一个或多个Class文件,这些Class文件中描述的类的各种信息,最终都需要加载到虚拟机中之后才能被运行和使用。事实上,虚拟机把描述类的数据从Class文件加载到...
  • justloveyou_
  • justloveyou_
  • 2017-05-18 13:48:22
  • 7022

JVM类加载机制详解(一)JVM类加载过程

首先Throws(抛出)几个自己学习过程中一直疑惑的问题: 1、什么是类加载?类加载的时机? 2、什么是类初始化?什么时候进行类初始化? 3、什么时候会为变量分配内存? 4、什么时候会为变量赋默认初值...
  • zhangliangzi
  • zhangliangzi
  • 2016-05-05 16:07:06
  • 21735

简述Java类加载方式及流程

在慕课网学习反射时想到自己之前学过的知识,故整理一番,希望能提供一点帮助,水平有限,如若有误欢迎指正。 Java提供了两种类的装载方式。一是预先加载,二是按需加载。因为可以对类进行按需加载,所以程序...
  • Selves_Nan
  • Selves_Nan
  • 2018-01-25 22:37:57
  • 76

类加载和对象的初始化过程

类的初始化和对象初始化是两个不同的概念。类的初始化是发生在类加载过程,是类加载过程的一个阶段,该阶段并不调用类的构造器。而对象的初始化是在类加载完成后为对象分配内存,实例变量的初始化,实例变量的赋值及...
  • zjl477595675
  • zjl477595675
  • 2015-08-30 08:34:38
  • 6696
    个人资料
    持之以恒
    等级:
    访问量: 6万+
    积分: 1814
    排名: 2万+