技术开发 频道

JAVA程序类加载及其反射机制

  【IT168 技术】当调用java命令运行某个Java程序时,该命令将启动一条Java虚拟机进程,同一个JVM的所有线程,所有变量都处于同一进程里,它们都是用该JVM进程的内存区。

  • 程序运行到最后正常结束。
  • 程序运行到使用System.exit()或Runtime().exit()代码结束程序。
  • 程序执行过程中遇到未捕获的异常或错误而结束。
  • 程序所在平台强制结束了JVM进程。

  类的加载

  类加载指的是将类的class文件读入内存,并为之创建一个java.lang.Class对象,而系统中所有的类,它们实际上也是对象,称为类对象,它们都是java.lang.Class的实例,虚拟机为每种类型管理一个少有的Class对象,也就是说,每个类(型)都有一个Class对象。

  类的连接

  连接阶段将会负责将类的二进制数据合并到JRE中

  • 验证
  • 准备:类准备阶段则负责将类的静态属性分配内存,并设置默认初始值
  • 解析

  类的初始化

  在类的初始化阶段,虚拟机负责对类进行初始化,主要就是对静态属性进行初始化,在Java类中对静态属性指定初始值有两种方式: (1)声明静态属性时指定初始值;(2)使用静态初始化块为静态属性制定初始值

  当Java程序首次通过下面6种方式来使用某个类或接口时,系统就会初始化该类或接口。

  a) 创建类的实例。

  b) 调用某个类的静态方法。

  c) 访问某个类或接口的静态属性,或为该静态属性赋值。

  d) 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象。

  e) 初始化某个类的子类,当初始化某个类的子类时,该子类的所有父类都会被初始化。

  f) 直接使用java.exe命令来运行某个主类时,程序会先初始化该主类。

  类加载器

  类加载器负责将.class文件加载到内存中,并为之生成对应的java.lang.Class对象。

  在Java中,一个类用其全限定类名(包括包名和类名)作为标识。

  在JVM中,一个类用其全限定类名和其类加载器作为其唯一标识。

  当JVM启动时,会形成由三个类加载器组成的:

  • Bootstrap ClassLoader:根类加载器 它不是java.lang.ClassLoader的子类,而是由JVM自身实现rt.jar。
  • Extension ClassLoader:扩展类加载器 它负责加载JRE的扩展目录ext中JAR的类包。
  • System ClassLoader:系统类加载器 它负责在JVM启动时,加载来自命令java中的-classpath选项或java.class.path系统属性,或CLASSPATH环境变量所指定的JAR包和类路径,默认是以当前路径作为系统加载路径。

  AppClassLoader:用户自定义类加载器。

0
相关文章