🐻动态代理
2021-3-8
| 2023-8-3
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
比较Java的classinterface的区别:
  • 可以实例化class(非abstract
  • 不能实例化interface
所有interface类型的变量总是通过某个实例向上转型并赋值给接口类型变量的:
有没有可能不编写实现类,直接在运行期创建某个interface的实例呢?
这是可能的,Java标准库提供了一种动态代理(Dynamic Proxy)的机制:可以在运行期动态创建某个interface的实例。
什么叫运行期动态创建?所谓动态代理,是和静态相对应的。
静态代码定义接口:
编写实现类:
创建实例,转型为接口并调用:
这种方式是我们通常编写代码的方式。
 
还有一种方式是动态代码,仍然先定义了接口Hello,但是我们并不去编写实现类,而是直接通过JDK提供的一个Proxy.newProxyInstance()创建了一个Hello接口对象。这种没有实现类但是在运行期动态创建了一个接口对象的方式,称为动态代码。JDK提供的动态创建接口对象的方式,就叫动态代理。
一个最简单的动态代理实现如下:
在运行期动态创建一个interface实例的方法如下:
  1. 定义一个InvocationHandler实例,负责实现接口的方法调用
  1. 通过Proxy.newProxyInstance()创建interface实例,它需要3个参数:
    1. 使用的ClassLoader,通常就是接口类的ClassLoader
    2. 需要实现的接口数组,至少需要传入一个接口进去
    3. 用来处理接口方法调用的InvocationHandler实例
  1. 将返回的Object强制转型为接口
动态代理实际上是JVM在运行期动态创建class字节码并加载的过程,并没有什么黑魔法,把上面的动态代理改写为静态实现类大概长这样:
其实就是JVM帮我们自动编写了一个上述类(不需要源码,可以直接生成字节码),并不存在可以直接实例化接口的黑魔法。
 
  • Java
  • 获取继承关系注解 Annotation
    目录