👏作者简介:大家好,我是Rockey,不知名企业的不知名Java开发工程师
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦,如果感觉和您的认知有一些偏颇,可以联系博主指正错误
📝联系方式:本人微信公众号 Rockey小何同学,关注后进群,大家一起学习,一起读书,一起对抗互联网寒冬👀
问题:Mybatis Mapper 接口没有实现类,怎么实现的动态代理?
答案:Mybatis 底层封装使用的 JDK 动态代理
什么是JDK 动态代理
假设有一个表示接口的 Class 对象(有可能只包含一个接口,) 它的确切类型在编译时无
法知道。这确实有些难度。要想构造一个实现这些接口的类,就需要使用 newlnstance 方法
或反射找出这个类的构造器。但是, 不能实例化一个接口,需要在程序处于运行状态时定义
一个新类。
为了解决这个问题, 有些程序将会生成代码;将这些代码放置在一个文件中;调用编译
器;然后再加载结果类文件。很自然, 这样做的速度会比较慢,并且需要将编译器与程序放
在一起。而代理机制则是一种更好的解决方案。代理类可以在运行时创建全新的类。这样的
代理类能够实现指定的接口。尤其是,它具有下列方法:
- 指定接口所需要的全部方法。
- Object 类中的全部方法, 例如, toString、 equals 等。
然而,不能在运行时定义这些方法的新代码。而是要提供一个调用处理器( invocation
handler)。调用处理器是实现了 InvocationHandler 接口的类对象。在这个接口中只有一个方法:
Object invoke(Object proxy, Method method, Object □ args)
无论何时调用代理对象的方法,调用处理器的 invoke 方法都会被调用, 并向其传递
Method 对象和原始的调用参数。 调用处理器必须给出处理调用的方式
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 点击跳转浏览。
创建代理对象
要想创建一个代理对象, 需要使用 Proxy 类的 newProxylnstance 方法。 这个方法有三个
参数:
- 一个类加栽器(class loader。) 作为 Java 安全模型的一部分, 对于系统类和从因特网
上下载下来的类,可以使用不同的类加载器。有关类加载器的详细内容将在卷 n 第 9 章中讨论。目前, 用 null 表示使用默认的类加载器。 - 一个 Class 对象数组, 每个元素都是需要实现的接口。
- 一个调用处理器
示例如下:
Subject 接口
public interface Subject {
String sayHello();
}
ProxyInvocationHandler类
public class ProxyInvocationHandler implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入代理调用处理器");
return "success";
}
}
ProxyTest类
public class ProxyTest {
public static void main(String[] args) {