反射:类的加载机制

来源:互联网 发布:惠州乐知英语 编辑:程序博客网 时间:2024/06/05 15:13

1.JVM的启动和退出

当调用java命令来运行某个Java程序时,该命令将会启动一个JVM进程.同一个JVM中的所有线程,变量都处于同一个进程中,共享该JVM的内存区域.
当出现以下情况是,JVM会退出:
 1):程序正常执行结束.
 2):使用System.exit(0)方法;
 3):出现异常时,没有捕获异常.
 4):平台强制结束JVM进程.
 
JVM进程一旦结束,该进程中内存中的数据将会丢失.

2.类的加载.连接.初始化

当程序主动使用到某个类时,如果该类还未被加载进内存中,则系统会通过加载,连接,初始化三个步骤来对该类进行初始化操作.

1):类的加载:
类加载时指将类的class文件(字节码文件)载入内存中,并为之创建一个java.lang.Class对象,我们称之为字节码对象.
类的加载过程由类加载器(ClassLoader)完成,类加载器通常有JVM提供,我们称之为系统类加载器,我们也可以继承ClassLoader类来提供自定义类加载器.
不同的类加载器可以实现加载本地字节码文件,jar包中的字节码,通过网络加载字节码等.
类的加载时机
以下的情况,会加载这个类。
 a. 创建类的实例 b. 类的静态变量,或者为静态变量赋值 c. 类的静态方法 d. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象 e. 初始化某个类的子类 f. 直接使用java.exe命令来运行某个主类
类加载器
负责将.class文件加载到内在中,并为之生成对应的Class对象。
a. Bootstrap ClassLoader 根类加载器  也被称为引导类加载器,负责Java核心类的加载  比如System,String等。在JDK中JRE的lib目录下rt.jar文件中b. Extension ClassLoader 扩展类加载器  负责JRE的扩展目录中jar包的加载。  在JDK中JRE的lib目录下ext目录c. System ClassLoader 系统类加载器  负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。  我们用的是System ClassLoader 系统类加载器

2):类的连接:
当类被加载进内存之后,系统为之生产一个对应的Class对象,接着把类的二进制数据合并到JRE中.
   1>:验证:检测被加载的类是否有正确的内部结构.
   2>:准备:负责为类的static变量分配内存,并设置默认值.
   3>:解析:把类的二进制数据中的符号引用替换为直接引用(深入分析JVM).

3):类的初始化:
在此阶段,JVM负责对类进行初始化,主要就是对static变量进行初始化.
  类的初始化一个类包含以下几个步骤:
  1>:如果该类还未被加载和连接,则程序先加载并连接该类.
  2>:如果该类的直接父类还未被初始化,则先初始化其父类.
  3>:如果类中有初始化语句(静态代码块),则系统依次执行这些初始化语句.


原创粉丝点击