类的加载机制
- 1.启动JVM
- 2.将需要运行的class文件加载到虚拟机内存中
- 3.找到主类,开始执行主函数
class文件是如何被加载到JVM内存中的?
通过类加载器将class文件加载到JVM内存中
类加载器:ClassLoader
AppClassLoader 应用类加载器,负责加载核心类,加载自己写的类
ExtClassLoader 扩展类加载器,负责加载扩展类库
bootstrap JVM内置的加载器
Bootstrap类加载器是JVM的一部分,是由C++编写的,
随着启动虚拟机就会创建一个bootstrap类加载器对象
加载步骤:
1.先委托父类加载类,如果父类已经加载,就不需要再次加载,如果父类没有加载,再由本加载器加载
2.解析类路径,将类路径转换成文件路径
3.通过文件输入流来读取class文件,得到字节数组
4.将字节数组转换成类对象,对象的类型是Class类型
每一个class文件读取到JVM内中之后,都转换成了一个Class对象
获得Class对象的几种方式:
//1.通过类名.class
Class c1 = Student.class;
//2.通过对象的getClass()方法
Class c2 = stu.getClass();
//3.通过类加载器获得class对象
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class c3 = classLoader.loadClass(“com.newer.test.Student”);
//4.通过 Class.forName()获得Class对象;
Class c4 = Class.forName(“com.newer.test.Student”);
任何一个类都只能被加载一次
自定义类加载器
加载到JVM内存之后,在内存中的存在形式?
加载到内存之后,以Class对象的形式存在
数组类型的Class对象
int[].class
数组对象.getClass();
基本类型的Class对象
int.class
基本类型对应的包装类的Class对象
Integer.class
对象.getClass();
Integer t = 100;
t.getClass();
Class.forName(“java.lang.Integer”);
loadClass(“java.lang.Integer”);
拿到包装类对应的基本类型的Class对象
Integer.TYPE;