Java类型信息与应用--动态代理

Posted jackingzheng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java类型信息与应用--动态代理相关的知识,希望对你有一定的参考价值。

Java类型信息与应用--动态代理

本文结构

  • 一、前言
  • 二、为什么需要RTTI
  • 三、RTTI在java中的工作原理
  • 四、类型转化前先做检测
  • 五、动态代理
  • 六、动态代理的不足

一、前言

运行时信息使你可以在程序运行时发现和使用类型信息

Java在运行时识别对象和类的信息的方式:

1.一种是RTTI,它假定我们在编译时已经知道了所有的类型。
2.另一种是“反射“机制,它允许我们在运行时发现和使用类的信息。
这带来的好处是,你可以在程序运行时发现和使用类型信息

二、为什么需要RTTI

以多态为例,如下图基类是Shape(泛型),而派生出来的具体类有Circle,Square和Triangle。
这里写图片描述

abstract class Shape {
    // this 调用当前类的toString()方法,返回实际的内容
    void draw(){ System.out.println(this + "draw()"); }

    abstract public String toString();
}

class Circle extends Shape {
    public String toString(){ return "Circle"; }
}

class Square extends Shape {
    public String toString(){ return "Square"; }
}

class Triangle extends Shape {
    public String toString(){ return "Triangle"; }
}

public static void main(String[] args){
    // 把Shape对象放入List<Shape>的数组的时候会向上转型为Shape,从而丢失了具体的类型信息
    List<Shape> shapeList = Arrays.asList(new Circle(), new Square(), new Triangle());
    // 从数组中取出时,这种容器,实际上所有的元素都当成Object持有,会自动将结果转型为Shape,这就是RTTI的基本的使用。
    for(Shape shape : shapeList){
        shape.draw();
    }
}

打印出以下结果

Circledraw()
Squaredraw()
Triangledraw()

RTTI在运行时识别一个对象类型,Shape对象具体执行什么的代码,由引用所指向的具体对象Circle、Square、或Triangle而决定

三、RTTI在java中的工作原理

在运行时获取类型信息是通过Class对象实现的,java通过Class对象(每个类都有一个Class对象)来执行其RTTI,而Java虚拟机通过“类加载器“的子系统,生成Class对象。
所有的类在第一次使用时,都会动态加载到JVM中。流程如下图:

Created with Raphaël 2.1.0 开始 1、第一个对类的静态成员引用 2、类加载器查找.class文件 3、将Class对象加载进入内存 4、用Class对象创建这个类的所有对象 结束

以上是关于Java类型信息与应用--动态代理的主要内容,如果未能解决你的问题,请参考以下文章

深入了解Java动态代理与反射机制

反射与代理

Java重要技术(27)动态代理之查看代理对象的类型信息

类加载与动态代理

java 动态代理(类型信息)

Java核心技术类型信息(Class对象 反射 动态代理)