*   为什么需要运行时识别对象和类的信息?
 
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<T>  
     限定Class引用必须是T类型  
     问题  
          Class<Number> genericNumberClass = int.class  
          Integer继承自Number  
          Integer.Class对象不是Number.Class对象的子类  
     解决以上问题  
          通配符" ? "  
          <? extends Number>
 
  
 
  
 
* 反射
 
  
 
* 什么是反射? 为什么要使用反射?
 
能够分析类能力的程序
 
  
 
java.lang.reflect  
这些类型的对象是由JVM在运行时创建的,可以表示未知类里对应的成员
 
  
   
    | 类名 | 
    作用 | 
   
    | Class | 
    代表一个类。 | 
   
    | Field | 
    
      代表类的成员变量(成员变量也称为类的属性)。?对象? 
     get() set()方法读取和修改与Field对象关联的字段 
 | 
   
    | Method | 
    代表类的方法。 用invoke()方法调用与此类关联的方法 | 
   
    | Constructor | 
    代表类的构造方法。 | 
   
    | Array | 
    提供了动态创建数组,以及访问数组的元素的静态方法。 | 
     
 
 
  
 
  RTTI与反射的区别?
 
RTTI编译时类型必须已知。 .class文件  
Reflection编译时不知晓类型
 
  
 
  
 
  
 
* class 文件原理
 
Class类  
程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型表示  
这个信息保存着每个独享所属的类足迹  
虚拟机利用运行时信息选择相应的方法(?类)执行
 
  
 
  
 
参考资料:
 
 
  
   java反射机制的实现原理
   
       
   【原】Java反射机制的原理及在Android下的简单应用
   
       
   Java学习之二-Java反射机制
   
   
 
  
 
 
  
 
  
 
  
 
 
    作者:love_world_ 发表于2013-12-17 0:01:02   
原文链接