• TIJ14_类型信息


    摘要

    1. 为什么需要RTTI:多态、向上转型(父)可以保证正确的函数执行,但实际并不知道对象的精确类型,只知道是一种父类型。如可能实际对象是Circle,但只能知道是个Shape。如果能知道精确类型,可以做更多的处理。
    2. 认识Class对象:
      是: 保存类型信息的特殊对象,保存在.class文件中
      懒加载: java程序运行时,并非加载了全部的类,只有在创建第1个对象是,才加载对应的Class对象。
      获取方式:
    Class.forName("");获取输入字符串名字的类或接口关联的Class对象;
    obj.getClass():从实例对象获取
    A.class:类型的字面常量。
    
    • 1
    • 2
    • 3

    包含的信息: 描述类的相关信息,叫什么、血缘、能力、创建1个

    动态代理

    特点:

    1. 目的是:功能增强
    2. 持有原始对象
    3. 代理和原始对象实现相同的接口
    4. 如何动态的调用方法?总不能每个方法都手写。动态的创建代理,根据实现的接口创建所有方法的调用

    相关实体:

    1. Interface,对外暴露的规格
    2. InvocationHandler接口实现:增强、且持有真实对象
    3. Proxy实例,通过Proxy.newProxyInstance()获得代理对象,引用handler

    接口与类型

    实践中接口的约定被破坏;可以尝试通过内部类约束调用者行为。

    总结

    Rtti与多态:尽量使用多态;rtti是对多态的补充。
    反射更动态、更多运行时异常

    个人总结

    本章知识的脉络是:

    1. rtti的引入的目的:对多态的补充,更精确的识别子类行,执行特定操作
    2. rtti的实现方式:Class对象,及常用方法
    3. 反射,另外的rtti类型;普通rtti,编译时是知道了具体类的类型信息;反射是运行时不知道类型信息。
    4. 经典的使用场景:动态代理、事务处理

    思维导图

    在这里插入图片描述


    实验

    1. 多态自动调用实际对象的方法,抽象类防止直接创建实例、保证函数被重写
      &:1.常见的多态代码;
      2.父类的数组引用类型指向的数组,由各种子类构成;统一调用父类定义的函数,实现多态。
      3.抽象类的作用:防止创建实体类;抽象函数的作用:保证被重写。
      4.此时:数组引用是不知道每个对的具体类型的,如果能知道最精确的类型,可以针对特定类型处理。如把三角形画出来并上色。就需要rtti。

    2. Class对象只有在被第1次调用static方法时,才会加载。
      &:创建类,且包含static代码块,检查static代码块的执行时机,确认是用到时才加载,不是程序执行就加载。

    3. 使用Class对象的常用方法:getName|isInterface|getInterfaces|getSuperclass|newInstance
      &:描述类:姓名、血缘、能力。
      1.Class.newInstance():使用的无参构造函数,保证类有无参构造函数。
      2.向上转型可以;平行子类间转型,编译器会提示;强制转报异常ClassCastException。
      3.递归调用继承树,可使用String的endsWith(“.Object”)判断。

    4. 基本知识:
      1.instanceof:java的保留关键字,是二元操作符,用来检查左边对象是否是右边Class类型的实例。
      eg:cat instanceof Cat。

    5. …:3个点,可变长度参数列表,支持0个或多个参数。
      ps:相对对象数组的优势是,允许0个参数。
      用在反射,构造函数中,因为不知道到底调用哪个构造函数,最终根据传入的参数个数和类型确定。

    6. 通过反射调用构造器的传参问题?
      &:构造器入参是可变长度的Object对象,即可穿入任意个、任意类型的Object,然后根据类型匹配构造器。
      ps:这应该是为了支持反射,必须具备的能力,否则反射的构造器、函数无法使用,因为传参时不知道。

    7. 简单代理的例子:自己和教程对比,忽略了消费者,体现不出实现1个接口的意义。

    8. 面向对象的编程:增加了类型信息。
      **多态:**在调用者看来,同样的代码(传入父类引用),执行不一样的结果。实际是不同的子类。扩展,不用修改外部调用代码。
      **面向过程:**没有类型信息,必须是不同的函数。如果扩展,必须修改代码。

  • 相关阅读:
    leetcode分类刷题:栈(Stack)(一、字符串相邻元素删除类型)
    【CSS】使用 scroll snap 实现页面的垂直大屏滚动
    TCP协议,TCP报头及特点基础介绍
    计算机组成与体系结构-进制转换
    Flutter实现地图上汇聚到一点的效果。
    JS-DOM-对象的事件onload、匿名函数、this
    PCL 点云超体素分割-SupervoxelClustering
    使用 Go 写入文件
    DataBaseHelper sqlsugar
    文件包含漏洞
  • 原文地址:https://blog.csdn.net/heroicpoem/article/details/126151061