Class类

2021/02/14 Java初级进阶 共 1292 字,约 4 分钟
闷骚的程序员

1. Class类是反射的核心

反射的核心就是依靠的Class类,即任何一个被JVM装载的目标类都存在唯一的一个class对象,用来描述该目标类的元信息。

2. Class类

2.1 初探Class类

  1. java中任何一个类或者接口都有唯一对应的Class实例与之对应。
  2. Class类的实例对象中保存着其对应的类或者接口的基本信息,比如类名称、当前类是接口还是类、当前类的属性、方法等等,因为Class实例用于描述当前类,因此称Class实例对当前类的类元,即用于描述当前类。
  3. 任何一个*.class字节码文件被装载进JVM后,会自动在方法区的静态区为该类产生一个static的静态字段class,这个class字段是个内存地址,指向当前类对应的Class对象实体,该字段是Class类的一个实例引用地址。
  4. 目标类对应的Class实例是由JVM自动创建的,该实例对象和目标类的实例对象一起保存在堆内存中。
  5. Class实例对象中聚合了目标类的各种方法、各种成员、父类、对应的接口、类名等元信息。
  6. Class实例封装了Java中任何一个目标类的所有信息,包括所属包的路径、类名称、成员变量、方法变量、成员方法等信息,并且提供了很多方法来操作目标类。
  7. 反射的核心就是通过操作目标类的Class对象,来间接的创建目标类的实例对象,获取目标类的各种属性,执行目标类的各种方法等。
  8. jdk底层的动态代理,就是依赖Class类来获取目标类的各种元信息,然后使用动态字节码机制生成一个虚拟的class字节码保存在JVM内存中。
  9. 总结:
    一个类的*.class文件被加载进JVM后,这个类会在JVM的方法区内存中缓存一个全局唯一的权限定地址,这个权限定地址被成为类链接符,和方法链接符类似。
    同时,一个类被加载进JVM后,会在堆内存中为该类首先创建一个Class实体对象,这个Class对象保存着对当前类的各种元信息的描述。
    方法区内存中的类链接符只会指向一个地方—>方法区内存的静态区。
    而方法区内存的静态区存储着当前类的Class对象的地址,和当前类所有的static成员的地址;其中Class对象的地址指向Class实体,这个实体就是存储在堆内存中目标类的结构描述信息。
    Person.name;
    Person.class;
    其中这个Person就是一个地址,表示类链接符,保存在方法区中,指向方法区内存的静态区;name是存储在方法区内存的静态区的静态成员的地址,class是存储在方法区内存的静态区的Class对象的地址,指向堆内存中的Class实例。

2.2 总结指向Class对象实体的指针

Class对象实体在堆内存中保存,但是整个JVM中指向该堆内存的指针共有三种:

  1. 任何一个java对象的头信息中的Klass变量保存着指向Class实体的地址。通过 obj.getClass() 方法向外部暴露出去。
  2. 类链接符指向方法区内存的静态区中的class字段,该字段保存着指向Class实体的地址。通过 Object.class 向外部暴露。
  3. Class类被装载进JVM后,通过Class.forName()方法向外部提供对应的Class实体的地址。

文档信息

Search

    Table of Contents