• Java 类型信息



    为什么需要运行时识别对象和类的信息?
    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运行时系统始终为所有的对象维护一个被称为运行时的类型表示
    这个信息保存着每个独享所属的类足迹
    虚拟机利用运行时信息选择相应的方法(?类)执行
    JVM使用类加载器,在类第一次使用时动态加载到JVM中。

    参考资料:
    详解reflect Java的反射机制


    java反射机制的实现原理

    【原】Java反射机制的原理及在Android下的简单应用

    Java学习之二-Java反射机制






  • 相关阅读:
    Google Analytics的Gif请求数据解读
    还原当年创业:屌丝逆袭后的华丽转身 (zz)
    减去脂肪,轻身上阵 (zz)
    离婚,感谢 (转载)
    delphi如何调用.NET webservice
    如何修改远程登陆3389端口
    软件中的2038问题讨论
    去掉cxgrid上面的分组的灰色栏
    从MDF文件恢复Sql Server2000数据库
    CxGrid的一些使用方法
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3478940.html
Copyright © 2020-2023  润新知