博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java实现动态代理的两种方式
阅读量:6354 次
发布时间:2019-06-22

本文共 2104 字,大约阅读时间需要 7 分钟。

一般而言,动态代理分为两种,一种是JDK反射机制提供的代理,另一种是CGLIB代理。在JDK代理,必须提供接口,而CGLIB则不需要提供接口,在Mybatis里两种动态代理技术都已经使用了,在Mybatis中通常在延迟加载的时候才会用到CGLIB动态代理。

1.JDK动态代理:

public interface Rent {    public void rent();}
public class Landlord implements Rent{    @Override    public void rent() {        System.out.println("房东要出租房子了!");    }}
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Intermediary implements InvocationHandler{        private Object post;        Intermediary(Object post){        this.post = post;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        Object invoke = method.invoke(post, args);        System.out.println("中介:该房源已发布!");        return invoke;    }}
import java.lang.reflect.Proxy;public class Test {    public static void main(String[] args) {        Rent rent = new Landlord();        Intermediary intermediary = new Intermediary(rent);        Rent rentProxy = (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), intermediary);        rentProxy.rent();    }}

2.CGLIB动态代理:

public class Landlord {    public void rent(){        System.out.println("房东要出租房子了!");    }}
import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class Intermediary implements MethodInterceptor {    @Override    public Object intercept(Object object, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {        Object intercept = methodProxy.invokeSuper(object, args);        System.out.println("中介:该房源已发布!");        return intercept;    }}
import net.sf.cglib.proxy.Enhancer;public class Test {    public static void main(String[] args) {        Intermediary intermediary = new Intermediary();                Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(Landlord.class);        enhancer.setCallback(intermediary);                Landlord rentProxy = (Landlord) enhancer.create();        rentProxy.rent();    }}

 

转载于:https://www.cnblogs.com/lxcmyf/p/6433018.html

你可能感兴趣的文章
oracle 中proc和oci操作对缓存不同处理
查看>>
[LeetCode] Spiral Matrix 解题报告
查看>>
60906磁悬浮动力系统应用研究与模型搭建
查看>>
指纹获取 Fingerprint2
查看>>
面试题目3:智能指针
查看>>
flask ORM: Flask-SQLAlchemy【单表】增删改查
查看>>
vim 常用指令
查看>>
nodejs 获取自己的ip
查看>>
Nest.js 处理错误
查看>>
你好,C++(16)用表达式表达我们的设计意图——4.1 用操作符对数据进行运算...
查看>>
18.3 redis 的安装
查看>>
jdbc 简单连接
查看>>
Activiti 实战篇 小试牛刀
查看>>
java中的Static class
查看>>
[工具类]视频音频格式转换
查看>>
GNS3与抓包工具Wireshark的关联
查看>>
groovy-语句
查看>>
Java VisualVM远程监控JVM
查看>>
nasm预处理器(2)
查看>>
二叉排序树 算法实验
查看>>