一旦类被加载了到了内存中,那么不论通过哪种方式获得该类的Class对象,它们返回的都是指向同一个java堆地址上的Class引用。jvm不会创建两个相同类型的Class对象
public class Cat {static {System.out.println("wwwww");}
}class T1 {public static void main(String[] args) throws ClassNotFoundException {System.out.println("inside main");Class c1 = Cat.class;Class c2 = Class.forName("com.example.demo.Cat");Class c3 = new Cat().getClass();System.out.println(c1 == c2);System.out.println(c2 == c3);System.out.println("finish main");}
}
从上面我们可以看出执行不同获取Class引用的方法,返回的其实都是同一个Class对象。
其实对于任意一个Class对象,都需要由它的类加载器和这个类本身一同确定其在就Java虚拟机中的唯一性,也就是说,即使两个Class对象来源于同一个Class文件,只要加载它们的类加载器不同,那这两个Class对象就必定不相等。这里的“相等”包括了代表类的Class对象的equals()、isAssignableFrom()、isInstance()等方法的返回结果,也包括了使用instanceof关键字对对象所属关系的判定结果。所以在java虚拟机中使用双亲委派模型来组织类加载器之间的关系,来保证Class对象的唯一性。