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中。流程如下图:
以上是关于Java类型信息与应用--动态代理的主要内容,如果未能解决你的问题,请参考以下文章