@author ixenos
摘要:Class类在反射中的地位、构造Class对象的三种方式、Class对象构造对应类型对象的三种方式
Class类在反射中的地位
位于java.lang下的Class类是位于java.lang.reflect下的Constructor类、Method类、Field类和Array类的入口类
-Class类 代表一个类
-Field类 代表类的成员变量(也成为类的属性、域)
-Array类 提供了动态创建数组、以及访问数组元素的静态方法
-Method类 代表类的方法
-Constructor类 代表类的构造方法
构造Class对象的三种方式
0.前言:
为了使用类而做的准备工作包括三个步骤:
1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象
2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用
3)初始化:若该类有超类,对其初始化,执行静态初始化器和静态初始化块。这是对类的初始化
-----------------------------
***static final int = 47 是编译期常量,不需要对类进行初始化就可以读取
***static final int = Random.nextInt(100) 是运行时常量,这种一般要在对象创建后才会运行,超过初始化的阶段了!
***static int = 47 是非常数的静态域,不是常量,更不是编译期常量,链接阶段只分配存储空间,初始化阶段才初始化
1.Class类的forName静态方法(自动初始化)
只知道对应类型名时,使用Class.forName(String name) 动态生成Class<String>对象,name是完全限定名
forName public static Class<?> forName(String className) throws ClassNotFoundException 返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于: Class.forName(className, true, currentLoader) 其中 currentLoader 表示当前类的定义类加载器。 例如,以下代码片段返回命名为 java.lang.Thread 的类的运行时 Class 描述符。 Class t = Class.forName("java.lang.Thread") 调用 forName("X") 将导致命名为 X 的类被初始化。 参数: className - 所需类的完全限定名。 返回: 具有指定名的类的 Class 对象。 抛出: LinkageError - 如果链接失败 ExceptionInInitializerError - 如果此方法所激发的初始化失败 ClassNotFoundException - 如果无法定位该类