@author ixenos
摘要:构造Class对象的三种方式、Class对象构造对应类型对象的三种方式
为了使用类而做的准备工作包括三个步骤:
1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象
2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用
3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块。
-----------------------------
***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取
***static final int = Random.nextInt(100) 是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!
***static int = 47 是静态域而已,不是常量,更不是编译期常量
只知道对应类型名时,使用Class.forName(String name) 动态生成Class<String>对象,
持有对应类型对象的引用时,使用对象的getClass()(属于根类Object的一部分),如new Integer(1).getClass()将返回Integer.class,而此时的类型对象也必定是在运行中了,所以已经初始化
例如 Fancy.class、String.class、Integer.TYPE
1)类字面常量应用于:普通类(包含包装类哟)、接口、数组、基本数据类型
***基本数据类型 使用标准字段TYPE,这是个指向基本数据类型的Class对象的引用
***例如int.class等价于Integer.TYPE,但是不等价于Integer.class
2)使用".class"来创建Class对象的引用时,不会自动地初始化该Class对象。
那为什么不会自动初始化呢?由补充内容可知初始化被延迟到了对静态(static)方法(构造器等同于隐式静态)或者非常数(final)静态域进行首次引用时才执行,而引用类字面常量在运行时只是到了加载和链接的阶段
先获得Class对象,然后通过Class对象的newInstance方法直接生成
1 Class<?> classType = String.class; 2 Object obj = classType.newInstance();
先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成
1 Class<?> classType = Customer.class; 2 //Class[]数组对应形参类型、个数,这里为空 3 Constructor cons = classType.getConstructor(new Class[]{}); 4 //Object[]数组对应传入的实参的类型、个数,这里为空 5 Object obj = cons.newInstance(new Object[]{});
先获得Class对象,然后通过Class对象生成Constructor对象,通过Constructor对象的newInstance方法生成
1 Class<?> classType = Customer.class; 2 //Class[]数组对应形参类型、个数,这里为Integer.TYPE,Xenos.class,String.class 3 Constructor cons = classType.getConstructor(new Class[]{Integer.TYPE, Xenos.class, String.class}); 4 //Object[]数组对应传入的实参的类型、个数,这里为1, new Xenos(), "Think" 5 Object obj = cons.newInstance(new Object[]{1, new Xenos(), "Think"});
原文:http://www.cnblogs.com/ixenos/p/5689878.html