类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。
加载:
就是指将.class文件读入内存,并为之创建一个Class对象。
任何类被使用时系统都会建立一个Class对象。
连接:
验证 :是否有正确的内部结构,并和其他类协调一致
准备 :负责为类的静态成员分配内存,并设置默认初始化值
解析:把类中的符号引用转换为直接引用
初始化 :
类的加载时机:
- 创建类的实例
- 访问类的静态变量,或者为静态变量赋值
- 调用类的静态方法
- 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象
- 初始化某个类的子类
- 直接使用java.exe命令来运行某个主类
类加载器:负责将.class文件加载进内存,并为之生成一个class对象;
分类:
- Bootstrap ClassLoade:根类加载器,负责Java核心类的加载,例如System,String,一般位于JRE目录下的rt.jar目录下;
- Extension ClassLoader:扩展类加载器,负责JRE扩展目录中的jar包加载,一般为JRE下lib目录下的ext目录下;
- Sysetm ClassLoader:系统类加载器,负责在JVM启动时加载来自java命令的class文件,以及classpath环境变量所指定的jar包和类路径。
反射机制:运行状态中,对于任意一个类,都能够获取这个类的所有属性和方法;
用处:从而对于任意一个对象,都能够调用它的任意一个方法和属性,这样动态获取类的信息以及动态调用对象的方法的功能称为java语言的反射机制;要想使用反射机制,要将该类的字节码文件对象获取到后,通过字节码文件对象,就能够剖析这个类的构成,以及调用类中的属性和功能;
获取类的字节码文件对象:(字节码文件对象只有一个)
1. getClass()方法;
Object obj = new Object();
Class a = obj.getClass();
Class b = obj.getClass();
System.out.println(a == b);
2. 通过类中的静态的Class属性,获取类的字节码文件对象;
Class objectClass = Object.class;
System.out.println(objectClass == a && objectClass == b);
3. 通过Class中的静态方法forName(),需要传入类的全限定名即:类名+包名
Class c = Class.forName("java.lang.Object");
System.out.println(a == c);