反射是什么东西??
我们利用反射库来编写一些特殊的程序,这种程序具有分析类的能力,这种特殊性就叫做可反射。
反射的机制十分强大,我们可以用这种机制实现动态操纵java代码。
先简要看一下反射的用处:
- 在运行时分析类的能力。
- 在运行时检查对象,例如,编写一个适用于所有类的toString方法。
- 实现泛型数组操作代码。(也许就是数组的每个元素都可以都可以操纵一部分java代码??)
- 利用Method 对象,这个对象很像C++中的函数指针
机制
要了解反射的机制,就必须知道Class类,这个类是用来干嘛的呢?(实现反射??哈哈无限循环了)当然,是有底层的机制被Class类封装再来实现反射机制。这个底层的机制就是:Java运行时系统始终为所有对象维护一个运行时类型标识。这是一种信息,关于各个类的所有对象的特殊信息。这个信息会跟踪每个对象所属的类。虚拟机利用运行时类型信息选择要执行的正确方法。
那么我们如何访问这些信息呢?就是使用Class类。
“Class对象实际上描述的是一个类型。这可能是类,也可能不是类。例如,int 不是类,但int.class确实是一个Class类型的对象。”我们是否可以理解为:类型有两种——基本类型和各种类,然后Class描述实例对应的类型。
使用反射
通过实例或者字符串得到匹配类的Class实例
使用getClass()方法返回一个包含当前实例(e)所属类运行时的信息对应的Class类的实例(cl)
当然,Class也是Object类的子类,也有getName()方法(不在包返回类名,在包里就加上一个包名)等等。建议使用的时候多记记。
使用字符串记录类名再用静态方法forName获得类名对应的对象
这里要用完整的类名才可以,要注意如果不是一个接口名或者类名,那么就该抛出异常了,我们应该处理好这个异常。
使用T.class得到一个匹配的类对象
虚拟机为每个类型管理一个唯一一个的Class对象。也就是说:每个对象调用getClass()方法后,得到的Class对象,和T.class得到的对象是同一个。因此我们可以使用
if(e.getClass() == Employee.class)
来测试未知对象e的匹配的Class对象是不是Employee类对应的Class对象,这个比instanceof严格一些。
通过Class实例构建对象
如果有一个Class 类型的对象,可以用它构造类的实例。调用gESnsEcto「方法将得到 一个Constructor 类型的对象,然后使用newlnstance方法来构造一个实例。
如果这个类没有无参构造,那就该处异常了
到目前为止,我们只能用反射来的出一个Class对象,以及用Class对象构造一个对应类的对象