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