new 的对象要求在编译期进行类路径的检查。而 Class.forName() 则可以在运行时动态获取。
并且反射可以绕过 JVM 的检查,去操作对象的熟悉和方法
Class clazz = Class.forName("cn.demojie.ReflectionTest");
Class.forName(String className);
// 可以指定 ClassLoader,以及是否实例化
Class.forName(String name, boolean initialize, ClassLoader loader);
// 自定义类加载器,实现从任意字节流进行类加载
ClassLoader.loadClass()/findClass()
基础数据类型的 Class 对象,是包装类型的:
// GETSTATIC java/lang/Integer.TYPE : Ljava/lang/Class;
// INVOKEVIRTUAL java/lang/Class.newInstance ()Ljava/lang/Object;
int.class.newInstance();
// Void.TYPE
Class clazz = void.class;