类加载器动态加载
(类加载器不是一下子将所有的类全部加载到内存中的)。
类加载器是动态的根据需要去加载各个字节码文件(Xxx.class)的,以下三种方式会触发类加载器去加载类的字节码文件:
new 这个类,创建新对象(构造方法其实也是静态方法)
调用这个类的静态字段或方法
手动加载 Class.forName("xxx.Xxx")
类加载器加载之前会先判断是否已经加载过这个类,如果已经加载过了就不会再次加载!
public class Student {
// 静态方法
public static void print() {
}
static {
System.out.println("加载这个类");
}
}
public class Demo {
public static void main(String[] args) {
// 第一种 新建对象
Student s1 = new Student();
// 第二种 调用静态字段或方法
Student.print();
try {
// 第三种 手动加载
Class clazz = Class.forName("lesson09.Student");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
获得Class对象
新建对象和调用类的静态字段和方法虽然可以触发创建Class对象,但是无法拿到Class对象引用,Class.forName(xxx.Xxx)是可以触发创建Class对象,并且会返回Class对象引用。
我们可以通过Class.forName(类路径)方法获得Class对象。
第一种:
Class clazz = Class.forName("lesson09.Student");
1
或者类名.class字段获得Class对象。
第二种
Class clazz = Student.class;
1
或者对象.getClass()获得Class对象。
第三种
Student s1 = new Student();
Class clazz = s1.getClass();
1
2
Class.forName(类路径)一定会新建一个Class对象吗?
不会!如果该类已经被加载过了就不会再次加载,而是直接返回Class对象引用。