说明:

所有的 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()));  //获取实现接口
    }