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类

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文件的来源
- 从本地系统中直接加载
- 通过网络下载.class文件
- 从zip,jar等归档文件中加载.class文件
- 从专有数据库中提取.class文件
- 将Java源文件动态编译为.class文件