jvm类加载

191 阅读2分钟

Java的类与Class

  • RTTI(Run-Time Type Identification) 运行时类型识别
  • 一个Class对象就是一个类的说明书,JVM根据这个说明书来创建类的实例对象,这个说明书保存在JVM的方法区中

JVM是如何创建一个类的

有一个Cat类

public class Cat {
    String name;
    String color;
}

创建一个Cat类的实例对象

Cat c = new Cat()

然后执行

javac Cat.java
java Cat

简单来说 大致流程如下图

.class文件长什么样

有人用编辑器打开.class文件看过吗?

比如Cat.java

我使用iHex这个工具打开Cat.class后,以十六进制展示成这个鬼样子

我们都知道计算机世界中是只认识0和1的, 所以.java文件是给人类看的,而.class文件是给计算机看的

二进制的.class文件是如何跑到JVM的方法区中的呢

类的加载

类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。

Class对象
 Class classCat = c.getClass();
  • classCat 是一个Class对象,全限定类名为java.lang.Class,它是由JVM自动构造的, 也可以理解为类加载后的最终产物
  • Class类没有公共的构造函数, 可以通过以下方式获取Class对象
    • obj.getClass()
    • Foo.class
    • Class.forName(String className)
  • Class对象代表了一个运行时的java程序中的 一个类或接口, 包含了该运行时类的信息
获取运行时某个类中包含的方法
  Arrays.stream(classCat.getMethods()).forEach(System.out::println);

获取运行时某个类中包含的成员变量
    Arrays.stream(classCat.getDeclaredFields()).forEach(System.out::println);

获取运行时某个类中包含的构造方法

一个类在什么时候被加载

一个类,当它第一次被使用时,会被加载到jvm的方法区

.class文件的来源
  1. 从本地系统中直接加载
  2. 通过网络下载.class文件
  3. 从zip,jar等归档文件中加载.class文件
  4. 从专有数据库中提取.class文件
  5. 将Java源文件动态编译为.class文件

是谁在执行类的加载