* 为什么需要运行时识别对象和类的信息? 1. 多态 - 实例都被向上转型为父类引用,实例调用相应方法时,需要知道当前父类型引用的具体类型,并从中查找相应方法。 2. IDE - 获取任意类的所有字段和方法。 跨网络的远程平台上创建和运行对象的能力 从磁盘文件,或者网络连接中获取一串字节(表示类) 对象序列化
* 运行时识别对象和类的信息的两种方式: RTTI: 运行时类型识别,在编译与运行时已知类型。 反射机制:运行期对模块无任何了解。
* 什么是RTTI? 在程序运行时保存其对象的型态信息的行为。
* RTTI的三种方法? 1. 强制类型转换 SuperClass instance = (SuperClass) sub;
2. 利用Class对象 Class class = Class.forName("className"); Class class = objectInstance.getClass(); Class class = ObjectInstance.class
3. 通过比较识别类型 if (sub instanceof SubClass) {} if ( Class.isInstance() )
* Class常用方法 1. getName()
由于历史原因
Double[].class.getName() 返回"[Ljava.lang.Double;"
int[].class.getName() 返回"["
2. forName()
静态 :立即加载类型信息
3. getClass()
4. T.class
动态:不理解加载 类型信息
代表匹配的类对象
一个类对象表示一个“类型”
这个类型未必是类,例如int不是类,int.clss是一个Class类型的对象
5.Class
限定Class引用必须是T类型
问题
Class
Integer继承自Number
解决以上问题
通配符" "
* 反射
* 什么是反射 为什么要使用反射? 能够分析类能力的程序
java.lang.reflect
这些类型的对象是由JVM在运行时创建的,可以表示未知类里对应的成员
| 类名 | 作用 |
| Class | 代表一个类。 |
| Field | 代表类的成员变量(成员变量也称为类的属性)。?对象? get() set()方法读取和修改与Field对象关联的字段 |
| Method | 代表类的方法。 用invoke()方法调用与此类关联的方法 |
| Constructor | 代表类的构造方法。 |
| Array | 提供了动态创建数组,以及访问数组的元素的静态方法。 |
RTTI与反射的区别? RTTI编译时类型必须已知。 .class文件
Reflection编译时不知晓类型
* class 文件原理 Class类
程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型表示
这个信息保存着每个独享所属的类足迹
虚拟机利用运行时信息选择相应的方法(?类)执行 JVM使用类加载器,在类第一次使用时动态加载到JVM中。
参考资料: 详解reflect Java的反射机制 http://developer.51cto.com/art/201104/252944.htm
java反射机制的实现原理 http://www.blogjava.net/qileilove/archive/2011/09/23/359350. html
【原】Java反射机制的原理及在 Android下的简单应用 http://www.cnblogs.com/crazypebble/archive/2011/04/13/2014582.html
Java学习之二-Java反射机制 http://www.cnblogs.com/quincy/archive/2011/06/19/2084557.html