什么是Class对象
Class类位于java核心包lang包中,它是反射的源头。Class对象用于记录每个类的运行时数据结构,或者说是在内存中访问类的静态数据的接口,每个类都有一个唯一的Class对象。Class对象不能直接通过new来获取,因为其构造器是私有的,下面是Class类的源码:
private Class(ClassLoader loader) {
// Initialize final field for classLoader. The initialization value of non-null
// prevents future JIT optimizations from assuming this final field is null.
classLoader = loader;
}
类加载过程将.class字节码文件加载到内存中,并将静态数据转化为方法区的运行时数据结构,并且Java虚拟机以及通过调类加载器中的 defineClass 方法自动在堆中构造这个类对应的Class对象
哪些类型拥有Class对象
说明:
如果两个数组对应的维数以及元素的数据类型相同的话,它们共享同一个Class对象
int[] arrayA = new int[5];
int[] arrayB = new int[2];
System.out.println(arrayA.getClass().hashCode());
System.out.println(arrayA.getClass().hashCode());
二者的hash值相同
获取Class对象的四种方法
方式一:调用运行时类的属性:.class
Class clazz = Person.class;
System.out.println(clazz);
方式二:调用运行时类的对象:调用getClass()方法
Person p = new Person();
Class clazz1 = p.getClass();
System.out.println(clazz1);
方式三:调用Class的静态方法:forName(String classPath)方法`
Class clazz2 = Class.forName("com.study1.Person");
Class aClass = Class.forName("java.lang.String");
System.out.println(clazz2);
System.out.println(aClass);
方式四:使用类的加载器:ClassLoader`
ClassLoader classLoader = ClassDemo.class.getClassLoader();
Class<?> aClass1 = classLoader.loadClass("com.study1.Person");
System.out.println(aClass1);
加载到内存中的运行时类,会缓存一定的时间。在此时间之内,我们可以通过不同的方式来获取此运行时类。