1.类的加载,连接和初始化
1.1 JVM和类
同一个JVM的所有线程,所有变量都处于同一个进程里,它们都使用该JVM进程的内存区,当系统出现一下情况,JVM进程将被终止:
1.1.1 程序运行到最后正常结束;
1.1.2 程序运行到System.exit()或Runtime.getRuntime().exit()代码结束程序;
1.1.3 程序运行过程中遇到了未捕获的异常或错误而结束;
1.1.4 程序所在平台强制结束了JVM进程。
当Java程序运行结束时,JVM进程结束,该进程在内存中状态将会丢失。
1.2 类的加载
当程序主动使用某个类时,如果该类未被加载到内存中,系统会通过加载、连接、初始化三个步骤来对该类进行初始化,统称为类加载或类初始化。
类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,也就是说当程序中使用任何类时,系统都会为之创建一个java.lang.Class对象。
系统中所有的类,它们实际上也是对象,它们都是java.lang.Class的实例。
1.3 类的连接
类的连接阶段负责把类的二进制数据合并到JRE中,可分为三个阶段:
1.3.1 验证:用于检验被加载的类是否有正确的内部结构,并和其他类协调一致;
1.3.2 负责:为类的静态属性分配内存,并设置默认初始值;
1.3.3 解析:将类的二进制数据中的符号引用替换成直接引用。
1.4 类的初始化
主要就是对静态属性进行初始化,在Java类中对静态属性指定初始值有两种方式:
1.4.1 声明静态属性时指定初始值;
1.4.2 使用静态初始化块为静态属性指定初始值。
类的初始化一般包括一下几个步骤:
1.4.1 若该类未被加载和连接,程序先加载并连接该类;
1.4.2 若该类的直接父类未被初始化,则先初始化其直接父类;
1.4.3 若该类中有初始化语句,则系统依次执行这些初始化语句。
因此,我们可以推算出,JVM最先初始化的总是java.lang.Object类。当任何一个类被系统使用时,系统会保证该类及所有父类都会被初始化。
1.5 类初始化的时机
当程序首次通过下面6种方式类使用某个类或接口时,系统就会初始化该类或接口;
1.5.1 创建该类的实例。为某个类创建实例的方式包括:
(1)new操作符来创建实例;
(2)通过反射来创建实例;
(3)通过反序列化的方式类创建实例。
1.5.2 调用某个类的静态方法;
1.5.3 访问某个类或接口的静态属性,或为该静态属性赋值;
1.5.4 使用反射方式来强制创建某个类或接口对应的Class对象。如:Class.forName("Person");,如果系统为初始化Person类,则会导致该Person类初始化并返回Person类对应的Class对象。
1.5.5 初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类都会被初始化。
1.5.6 直接使用java.exe命令来运行某个筑垒,当运行某个主类时,程序会先初始化该主类。
另外需要注意一下2点:(1)对于一个final类型的静态属性,如果该属性可以在编译时就得到属性值,则可认为该属性可被当成编译时常量。当程序使用该编译时常量时,系统会认为这是对该类的被动使用,所以不会导致该类的初始化。即相当于使用一个常量。(2)使用ClassLoader类的loadClass方法来加载某个类时,该方法只是加载该类,并不会执行类的初始化。使用Class的forName静态方法才会导致强制初始化该类。
。。。 。。。
分享到:
相关推荐
本学习讲义是关于java类加载和反射机制需要注意的要点学习,内容详细
Java反射动态加载实例类,动态加载实例类,帮助理解反射
Java的类加载机制:加载,连接,初始化。JAVA类加载器: Bootstrap ClassLoader : 根类加载器, Extension ClassLoader: 扩展类加载器, System ClassLoader : 系统类加载器, Java反射
类加载机制及反射 类加载机制及反射
java 类加密 使用类加载器解密加载类 反射执行main
java 类加载 。。。反射
java 注解 反射 字节码 类加载 包括pdf资料以及全部源码文件,具有非常大参考价值和学习意义
反射,动态加载指定类调用类中的方法 简单例子
反射机制和类加载机制学习总结 Reflection 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。例如,使用它能获得 Java 类中各成员的名称并...
1、 使用反射方法强制创建某各类或者接口对应的java.lang.Class对象时,会进行类加载,(而类加载会将字节码的class文件读入内存,并为之创建一个Class对象)。 2、 反射让类加载了,当然接着可以调用类的属性和方法...
(类的加载概述和加载时机) (类加载器的概述和分类) (获取class文件对象的三种方式) (通过反射获取无参构造方法并使用) (通过反射获取带参构造方法并使用) (通过反射获取私有构造方法并使用) (通过反射获取成员变量并...
Java 程序在运行期间可以动态加载、解析和使用一些在编译阶段并不确定的类型数据,这一机制被称为反射(Reflection)。反射库(reflection library)提供了一个非常丰富且精心设计的工具类,以便编写能够动态操纵Java...
JAVA反射机制与类的加载,详细的说明java反射机制的实例以及应用是入门级的课件
33_反射(类加载、反射)_讲义
一、java反射机制概述 Reflection (反射)被视为动态语言的关键,为什么这么说...这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象称之为:反射。 2.反射中类的加载 2.1.1 加载 什么是类的加载呢?
2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的.class文件则重新加载该实现类的class。 4. 调用方法前,先获取最新的代理类,...
java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;java反射例子,封装了一个反射帮助类,解压,加载到myeclipse上可用;
Chp15 反射Key Point ●Class 对象及其基本操作●Method 对象...说明下面几种情况,应该采用哪种获得类对象的方法1)获得String 类的类对象2)加载一个类,该类的全限定名写在某个配置文件中3)打印某个对象的所有方法
主要介绍了java 类加载机制和反射详解及实例代码的相关资料,需要的朋友可以参考下
加载jar这一部分很容易,可是卸载jar就没那么容易了。加载jar的时候需要用反射去调用URLClassLoader的addURL方法。}%>jars.jar内