反射(一):类加载机制的简单描写和反射初探


java的内存模型

  1. 首先我们了解一下JVM,什么是JVM,Java的虚拟机,java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,只不过他的作用是用来跑你的代码的。上图是java的内存模型,我们关注的点,一个方法区,一个栈,一个堆,初学的时候老师不深入的话只告诉你java的内存分为堆和栈,易懂点吧!
  2. 假如你写了一段代码:Object o=new Object();运行了起来!
  3. 首先JVM会启动,你的代码会编译成一个.class文件,然后被类加载器加载进jvm的内存中,你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象,每个类只有一个class对象,作为方法区类的数据结构的接口。jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。
  4. 上面的流程就是你自己写好的代码扔给jvm去跑,跑完就over了,jvm关闭,你的程序也停止了。

JVM和类的简单描述

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

JVM加载类的简单步骤(具体可以参考周志明的《深入理解Java虚拟机》)


  1. 什么时候初始化?:
    当程序主动使用到某个类时,如果该类还未被加载进内存中,则系统会通过加载,连接,初始化三个步骤来对该类进行初始化操作.
  2. 类的加载:
    类加载时指将类的class文件(字节码文件)载入内存中,并为之创建一个java.lang.Class对象,我们称之为字节码对象.类的加载过程由类加载器(ClassLoader)完成,类加载器通常有JVM提供,我们称之为系统类加载器,我们也可以继承ClassLoader类来提供自定义类加载器.
    不同的类加载器可以实现加载本地字节码文件,jar包中的字节码,通过网络加载字节码等.
  3. 类的连接:
    当类被加载进内存之后,系统为之生产一个对应的Class对象,接着把类的二进制数据合并到JRE中.
    1. 验证:检测被加载的类是否有正确的内部结构.
    2. 准备:负责为类的static变量分配内存,并设置默认值.
    3. 解析:把类的二进制数据中的符号引用 替换为 直接引用(深入分析JVM).
  4. 类的初始化:
    在此阶段,JVM负责对类进行初始化,主要就是对static变量进行初始化,类的初始化一个类包含以下几个步骤:
    1. 如果该类还未被加载和连接,则程序先加载并连接该类.
    2. 如果该类的直接父类还未被初始化,则先初始化其父类.
    3. 如果类中有初始化语句(静态代码块),则系统依次执行这些初始化语句.
  5. 什么是符号引用?:
    符号引用是一个字符串,它给出了被引用的内容的名字并且可能会包含一些其他关于这个被引用项的信息——这些信息必须足以唯一的识别一个类、字段、方法。
    这样,对于其他类的符号引用必须给出类的全名。

猜你喜欢

转载自blog.csdn.net/qq_25385555/article/details/78959040