说明:
所有的 Java 类型(包括基本数据类型、引用数据类型、void)被加载到内存后,或者编译器自动编译生成的 class 字节码,最终都会用一个 Class 对象表示。所以Class是表示创建的类的类型信息。每个通过关键字class标识的类,在内存中有且只有一个与之对应的Class对象来描述其类型信息,无论创建多少个实例对象,其依据的都是用一个Class对象。Class类只存私有构造函数,因此对应Class对象只能有JVM创建和加载。Class类的对象作用是运行时提供或获得某个对象的类型信息
获取Class对象的方法:
Class.forName(“类的全限定名”):forName在执行的过程中发现如果类还没有被加载,那么JVM就会调用类加载器去加载此类,并返回加载后的Class对象
实例对象.getClass()
类名.class (类字面常量)
从 Class 中获取信息
class Candy {
static { System.out.println("Loading Candy"); }
}
public class Main { //Class.forName(“类的全限定名”)
public static void main(String[] args) throws ClassNotFoundException {
List<Class<?>> list = new ArrayList<>();
list.add(String.class); //使用class关键字,通过类名获取
list.add(Class.forName("java.lang.String")); //使用Class类静态方法forName(),通过包名.类名获取,注意返回值是Class<?>
list.add("zzp".getClass()); //通过实例对象获取
for (Class<?> aClass : list) {
System.out.println(aClass);
}
}
}
注意:Candy的代码块只执行了一次,说明其Class类只被加载了一次,Class唯一。
从Class类中获取信息
public static void main(String[] args) {
System.out.println(String.class.getPackage()); //获取package
System.out.println(String.class.getName()); //获取类名
System.out.println(Integer.class.getSuperclass()); //获取父类
System.out.println(Arrays.toString(String.class.getInterfaces())); //获取实现接口
}