`
sean2012
  • 浏览: 44533 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Class加载机制——加载过程

阅读更多
Class加载机制


        Java之所以能够实现跨平台,是因为Java Virtual Machine(Java虚拟机)的优势;简而言之,我们编写的源代码(.java),通过Java编译器编译成为了字节码(.class)文件后,由不同平台相应的JVM通过解释执行;那么字节码(.class)没有变化,变化的是运行在不同平台上的JVM;而通过不同平台上的JVM最终生成可以运行在相应平台上的软件;这样就实现了跨平台。(注意:JVM本身是不跨平台的哟!不同的平台拥有不同的JVM)
          Java是面向对象的编程语言,那么Java创建一个对象是如何实现的呢?仅仅是(new)一下这么简单吗?让我们开启JVM的大门,寻找Class加载机制的奥秘!

一、Class加载的过程

1、Class加载:JVM会做这样一件事情,就是找到Class文件,读取Class文件中的内容;

2、Class连接:JVM会做这样三件事情;
         1)验证:确保Class文件的正确性 ,为什么还要验证呢?难道Java编译器生成的Class文件不是可靠的吗?这其中的原因就是,JVM为了防止人为的编写错误的Class文件,最终会造成JVM的错误;
         2)准备:将Class中的静态变量分配内存,赋予默认值
         3)解析:将Class中的符号引用替换成直接引用。

3、Class初始化:为静态变量赋予正确的初始值
         以上就是一个Class的加载过程,如果仔细了解完后,你会发现一个疑问,为什么在Class连接的准备阶段Class会被赋予“默认值”,而Class初始化再一次赋予“正确的初始值”呢?原因是这样的:

例如:
class Test {
	public static int number1;
	public static int number2 = 1;
}

        number1,number2 在Class连接准备阶段,它们被赋予默认值0,如果是Class类型则为Null;而到Class初始化时,number1的值还是默认值,number2则被重新赋予了1。接下来我们看一个被称为“所以程序员都会犯错的一个实例”:
package com.sean.jvm;

public class Test {
	public static void main(String[] args) {
		SingleModel singleOBJ = SingleModel.getInstance();
		System.out.println("number1==" + singleOBJ.number1);
		System.out.println("number2==" + singleOBJ.number2);
	}
}

class SingleModel {

	private static SingleModel singleClass = new SingleModel();
	public static int number1;
	public static int number2 = 0;

	public SingleModel() {
		number1++;
		number2++;
	}

	public static SingleModel getInstance() {
		return singleClass;
	}
}

        你知道结果是多少吗?如果你觉得number1和number2的值都是1那么你就错啦!正确答案是1和0;原因是在SingleModel 类初始化后确定两个属性都自增为1,但是经过静态属性顺序初始化后,number2又被重新赋予了0;所以结果成了1和0;
package com.sean.jvm;

public class Test {
	public static void main(String[] args) {
		SingleModel singleOBJ = SingleModel.getInstance();
		System.out.println("number1==" + singleOBJ.number1);
		System.out.println("number2==" + singleOBJ.number2);
	}

}

class SingleModel {

	public static int number1;
	public static int number2 = 0;
	private static SingleModel singleClass = new SingleModel();

	public SingleModel() {
		number1++;
		number2++;
	}

	public static SingleModel getInstance() {
		return singleClass;
	}
}

        如果把“private static SingleModel singleClass = new SingleModel();
”这一句放下来,那结果又会怎样呢?    
     

二、Class加载的触发条件
        具体来分析一下Class的加载机制中的加载形式,首先我们需要知道JVM什么时候需要加载Class?
        JVM加载Class有两种方式:主动加载、被动加载;
        主动加载有六种形式:
        1)、new Object();(最常见)
       2)、SingleModel.number=0;(使用类中的静态属性时)
       3)、SingleModel.getInstance();(使用类中的静态方法时)
       4)、Class.forName("com.sean.jvm.Test");(动态加载时)
       5)、初始化一个子类时;(一个子类被实例化,那么它的父类也就被加载)
       6)、启动类;(含main方法的类)
       除以上六种形式之外的Class加载都被称为:被动加载(特点:不会初始化)。


三、Class加载途径
         我们在Java开发过程中,Class文件常见的来源是我们自己编写的Java源代码编译后而得到的,还有一种是来自我们引用了他人写好的架包(.jar等压缩包);然而Java不仅仅提供了这两种方式,也可以通过java.net.URLClassLoader这个类从网络上获得Class,来加载到我们的软件中;还可以通过Class专用数据库中提取Class以及采用动态编译Class方式加载Class;是不是对Class加载途径有了新认识呢?

        挖掘了Class的加载中的这么多奥秘,发现越挖越多,Class加载器中所蕴含的宝藏还远远不止这些,下一篇会更精彩,欢迎指正!
  • 大小: 4.4 KB
分享到:
评论

相关推荐

    Java反射机制——类的加载方法,创建对象,获取方法以及结构

    加载完类之后,在堆内的方法区中就产生了一个Class类型的对象(一个类只有一个class对象),这个对象就包含了完整类的结构信息,我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构...

    JVM学习笔记(一)——类的加载机制

    第一章(类的加载机制) 1、什么是类的加载 ​ 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的...

    【JVM】类的奇幻漂流——类加载机制探秘

    本文可以带着读者初探类加载机制。上来先放类加载各个阶段的主要任务,用于给读者一个大概的印象体验,现在记不住也没有什么关系。 现在只需要记住三个名词,装载——>连接——>初始化,记住了吗,我们要开始奇幻...

    JVM解毒——类加载子系统

    带着问题,尤其是面试问题的学习才是最高效的。...Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制

    Java虚拟机之类加载机制

    后在运行的时候,虚拟机把描述类的信息从class文件加载到内存,然后再进行校验、解析和初始化等过程,后形成可以被java虚拟机“读懂”的java类型。那么从class——>java虚拟机能“读懂”的java类型是本文要讲解的...

    【JVM】类加载器与双亲委派模型

    有关类加载的全过程,可以先参考我的另外一篇文章类的奇幻漂流——类加载机制探秘 类加载器的类型 类加载器有以下种类: 启动类加载器(Bootstrap ClassLoader) 扩展类加载器(Extension ClassLoader) 应用类...

    Visual C++实践与提高-COM和COM+篇『PDF』

    2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM...

    不了解java反射机制,怎么看懂框架

    文章目录一、理解反射的基础(重要指数五颗星爆表)1.Class文件2.Java虚拟机的类加载机制二、反射——框架设计的灵魂2.1是什么2.2与反射相关的类三、反射的使用3.1获得Class对象的三种方式3.2反射调用构造方法并使用...

    Java典型模块

    3.3.1 反射的基石——Class类 3.3.2 反射的基本应用 3.3.3 反射的高级应用 3.4 标注 3.4.1 标注的简单使用 3.4.2 JDK的内置标注 3.5 泛型 3.5.1 为什么要使用泛型 3.5.2 泛型的一些特性 3.5.3 泛型的通配符 3.6 类...

    .NET之美:.NET关键技术深入分析

    1.4.1从类型设计谈起,Class还是Struct 1.4.2数据不一致的问题 1.4.3 常量性和原子性 1.4.4避免外部类型对类型内部的访问 1.5本章小结 第2章C#中的泛型 2.1理解泛型 2.1.1 为什么要有泛型 2.1.2类型参数约束...

    asp.net知识库

    asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 ...

    javaSE代码实例

    10.6 Java程序的加载过程 190 10.7 小结 192 第三篇 高级基础篇 第11章 异常处理——Java世界的医生 195 11.1 异常处理的基本知识 195 11.1.1 try和catch捕获异常 195 11.1.2 异常的传播过程 198 ...

    Java开发技术大全 电子版

    9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断所属类292 9.6利用反射获取运行时类信息293 9.6.1使用isInstance()方法判断所属类294 9.6.2获取...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    jquery插件使用方法大全

    要等到页面全部加载完毕才执行,注意是全部加载,包括dom,图片等其它资源。 而$(document).ready(function(){ alert("hello"); });(1) 当dom加载完就可以执行了。 代码1同时做到表现和逻辑分离。并且可以在...

    MFC的程序框架剖析

    什么是句柄?...也就是说MFC都是让我们采用默认的窗口过程函数,这并不是说我们因此就不能使用自己的窗口过程函数实现个性化的消息处理了,MFC采用了一种基于消息映射的机制完成了消息个性化处理。...

    Spring.3.x企业应用开发实战(完整版).part2

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

    Spring3.x企业应用开发实战(完整版) part1

     《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练...

Global site tag (gtag.js) - Google Analytics