`
zyfautonavi
  • 浏览: 14828 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java类的加载

阅读更多
当通过java命令运行一个java程序的时候就启动了一个java虚拟机进程,这个进程会在以下情况下中止:
1.正常结束
2.出现异常和错误
3.程序中调用System.exit()
4.操作系统出现异常
当有两个程序在运行时一定是两个进程在执行,一个程序结束这能说明一个虚拟机进程结束而不是所有的进程结束。
当程序使用到一个类时java虚拟机需要先加载这个类,加载后的最终产品是该类的Class对象。加载过程分三个步骤,如下:
1.加载:(此处的”加载“是上面说的加载的第一步)
把类的.class文件中的二进制数据读入到内存,.class可能来自本地系统、下载的jar报中的class、专有数据库中提取.class 文件。进程会把二进制数据存放在运行时的数据区的
方法去内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区的数据结构,并且向java程序提供了访问类在方法去内的数据结构的接口,如下图:
类的加载是由类的加载器完成的,分为两种:
1)java虚拟机自带的类的加载器,包括启动类的加载器,扩展类加载器,系统类加载器
2)用户自定义类加载器,即继承java.lang.ClassLoader类,用户通过覆盖父类方法来定制类的加载方式。
后面会详细介绍类加载器。
类的加载的时机不同于类的初始化,类的初始化是在程序“首次主动使用它”才会加载。而类的加载并不需要类的“首次主动使用”才会加载,“首次主动使用”会在下面说明
java虚拟机会在预料到某个类预先使用它的时候预先加载该类,如果在预先加载的时候发现.class错误或者.class文件缺失,并不会报告错误,只有等到类主动使用该类时
2.连接包括以下过程
1)验证:确保被加载类的正确性。虽然在加载的时候已经验证,但虚拟机并不知道这个class到底是由谁创建的,是程序员还是黑客,经过验证可以保证程序的健壮性和
安全性
      1)类文件结构检查:检查.class的文件的格式
             2)语义检查:是否符合java语法规定,比如final类型不能覆盖和不能有子类。
             3)字节码流检查:字节码流代表类的静态方法和实例方法,字节码流是由一组单字节指令组成的,这个指令叫操作码,每个操作码后面有一个或多个操作数,需要
检查是否有合法的操作数。
             4)二进制兼容的验证:检查相互引用的类是否一致,例如A类一个方法调用B类的方法,他会查看内存中
                方法区是否存在B类那个方法的字节码
2)准备:为类的静态变量分配内存,并将其初始化为默认值,例如int类型,为他分配空间,并且默认值为0
3)解析:把类中的符号引用转换为直接引用。如A类有个方法内有B.car()这个方法,那么解析就是将car()  这个描述符替换为指针,指向内存方法去中car()这个字节码
的内存地址
3.初始话:
给类的静态变量赋予正确的值,可以显示赋值,也可以在static{}中为静态变量赋值。如果一个类有父类就先初始化父类的静态变量,在任何初始化之前一定是先加载和连接该类
。只有在程序首次主动使用类时,类的初始化才会执行。”首次主动执行“包括六种动作,也就是说初始化在以下六种动作才会被执行。
  1)创建类的实例:包括new,反射,克隆,反序列化创建
  2)调用类的静态方法
  3)访问类或接口的静态变量或为他赋值
  4)初始化子类
  5)调用java api 某些反射方法,如Class.forName("work"),如果work类还没有初始化,那么该操作会初始化他,并创建work类的Class实例
  6)java虚拟机启动时表明启动类的类,如java sample命令,该命令启动sample,会初始化他
说明:
1.如果是final类型的静态变量,调用他并不一定会初始化该类,这要看final类型的变量在类加载连接的时候是否可以计算出他的值,如果能,那么就不会触发初始化该类,反之
。例如 final staitc int a =  5+9 ;这个在连接时可以确定a的值并为他分配空间。但如果是 final static int a = Math.random()+9就不能确定,这个值需要在运行的时候确
定,方法的返回值是在运行时确定的。所以会初始化该类。
2.当类初始化的时候一定要先初始化他的父类,但如果是初始化接口却不会初始化他的父接口。只有调用该接口的静态变量时才会导致该接口的初始化。如果调用子类中属于父类的
静态方法和静态变量不会导致子类的初始化。
3.如果调用ClassLoader类的loadClass()方法加载类,不会导致初始化,但会加载该类。只有显示调用Class.forName()的时候才算是主动使用他,才会初始化
分享到:
评论
1 楼 该用户名已经存在 2011-11-23  
引用

相关推荐

    java类加载器

    类加载器在Java中扮演着至关重要的角色,不仅负责加载类,还维护了类的层次关系,确保了系统的稳定性和安全性。通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖...

    Java类加载内幕详细讲解

    类加载器是Java运行时环境的重要组成部分,负责加载类到JVM中,并确保类的正确加载与隔离。类加载器的基本结构如下: 1. **引导类加载器**(Bootstrap Class Loader):这是系统默认的类加载器,负责加载JRE/lib/rt...

    Java类加载器原理

    类加载器的作用不仅仅是加载类,还包括确保类的唯一性,避免重复加载,并且遵循特定的加载顺序。以下是对类加载器原理的详细解释: 1. 类加载器作用: 当JVM启动时,如果需要使用某个类,对应的类加载器会将这个类...

    java 类加载器 加密

    总结起来,Java 类加载器加密是一种增强程序安全性的技术,通过自定义类加载器和解密逻辑,可以在加载类之前对其进行加密,提高代码的保护性。同时,结合反射机制,即使类是加密状态,也能正常执行程序。这种技术常...

    自定义Java类加载器

    Java类加载器是Java虚拟机(JVM)的关键组成部分,它负责查找并加载类到内存中,使得程序能够运行。自定义Java类加载器允许我们根据特定需求扩展默认的加载机制,例如,从非标准位置加载类或者实现动态加载。在Java...

    Java类加载器.pdf

    - 使用`Class.forName(String className)`或`Class.forName(String className, boolean initialize, ClassLoader loader)`方法显式加载类。 - 使用`ClassLoader.loadClass(String name)`方法显式加载类。 其中,`...

    深入研究Java类加载机制 深入研究Java类加载机制

    Java中的类加载器遵循一个原则叫做“父母委托模型”,即当一个类加载器收到类加载请求时,首先将加载任务委托给父类加载器,只有当父类加载器无法完成加载时才会尝试自己加载。 这种设计模式的好处在于避免了类的...

    java类加载器学习三、类加载器的委托模式

    java类加载器学习三、类加载器的委托模式

    Java类加载原理解析

    除了这三种预定义的类加载器,Java还提供了一种特殊的**线程上下文类加载器(Thread Context ClassLoader)**,它允许在特定线程中加载类时使用非默认的类加载器。这在插件框架和OSGi等动态部署环境中尤其有用。 ...

    java类加载器-tomcat中的类加载器

    每个类加载器在尝试加载类时,会先委托给父类加载器,只有当父类加载器无法加载时,才会尝试自己加载。这种机制保证了Java的核心类库只被加载一次,同时也确保了类的唯一性。 Tomcat的类加载器工作流程可以总结为:...

    java类加载原理分析

    类加载的过程遵循“双亲委派模型”(Delegation Model),即当一个类加载器接收到加载类的请求时,它首先会委托其父加载器尝试加载,只有在父加载器无法加载时,自身才会尝试加载。这样设计可以避免类的重复加载,并...

    深入探讨 Java 类加载器

    当一个类加载器尝试加载类时,它会先委托给父类加载器,只有在父类加载器无法找到相应类时,子类加载器才会尝试加载。这种机制避免了类的重复加载,并且允许自定义类加载器覆盖父类加载器的行为。 线程上下文类加载...

    java类加载机制

    双亲委派模型是Java类加载器的重要特性之一,它的基本流程是:当一个类加载器收到加载类的请求时,它首先不会自己去尝试加载这个类,而是把请求委托给父类加载器去完成,每个层次的类加载器都是如此。如果父类加载器...

    Java类加载机制.doc

    例如,如果你正在开发一个需要从远程服务器获取辅助代码的系统,你可以创建一个类加载器,它可以从指定的URL加载类字节码,然后将其转换为java.lang.Class对象。这样做可以让应用程序动态地更新和使用远程服务器上的...

    Java类加载机制

    4. **自定义类加载器(Custom Class Loader)**:开发者可以根据需要创建自定义的类加载器,以便支持特殊的需求,比如从网络加载类或动态地修改字节码。 #### 五、类加载过程 类加载过程主要包括三个阶段:加载、...

    深入解析Java类加载器及其工作机制

    Java 类加载器是 Java 运行时环境中不可或缺的组成部分,负责将 .class 文件加载到 JVM 中。理解类加载器的工作原理对于深入掌握 Java 语言及其运行机制至关重要。本文将详细探讨 Java 类加载器的概念、类型以及工作...

    java类加载机制.xmind

    该文件是JVM中关于类加载机制的知识整理的思维导图,包括类加载机制概述、类加载的生命周期、加载时机、加载过程、类加载、类的初始化和实例化等几个大方面进行了讲解,其中类加载中还对JVM三种预定义类加载器进行了...

    Java类加载及SPI机制.pdf

    为了避免重复加载类和防止核心类库被篡改,Java采用了委派模式来加载类。即如果一个类加载器收到了类加载的请求,它首先不会自己尝试去加载这个类,而是将加载请求委托给父类加载器去完成,每一层都是如此,只有当...

Global site tag (gtag.js) - Google Analytics