@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 - 如果无法定位该类
API文档描述

相关文章: