如何手写一个JDK动态代理?

简介: 如何手写一个JDK动态代理?

一、动态代理


代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别。通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性。Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的设计理念。


二、实现步骤

 * 动态代理本身比较难理解,总结步骤:
 * 1.编写自定义接口【包含了真实角色的方法】
 * 2.编写真是角色,重写接口方法
 * 3.编写动态代理角色类,implements InvocationHandler接口,在通过method.invoke()方法,调用真实角色的方法
 * 4.使用:根据真实角色,产生初步代理的handler = new DynamicProxy(真实角色);
 * 5.在通过subProxy = (自定义接口)Proxy.newProxyInstance(类加载器,真实角色的接口,handler),产生最终代理对象
 * 6.最终代理对象调用真实角色的方法

三、实践


3.1 租房接口

public interface Subject {
    public abstract boolean rent(int money);
}

3.2 真实角色

public class RealSubject implements Subject {
    @Override
    public boolean rent(int money) {
        System.out.println("租房子需要花:"+money+"元");
        return true;
    }
}

3.3 动态代理角色

public class DynamicProxy implements InvocationHandler {
    // 代理的角色  代理的方法  方法的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        this.before();
        Object result = method.invoke(obj,args);
        this.after();
        return result;
    }
    private void after() {
        System.out.println("after...");
    }
    //可以代理任意类型的对象
    private Object obj;
    public DynamicProxy(Object obj){
        this.obj = obj;
    }
    public void before(){
        System.out.println("before...");
    }
}

3.4 测试

public class TestDynamicProxy {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();
        InvocationHandler handler = new DynamicProxy(realSubject);
        Subject subProxy = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
                realSubject.getClass().getInterfaces(), handler);
        boolean rent = subProxy.rent(3000);
        System.out.println(rent?"ok":"error");
    }
}

4085de6fbdae478cabd5d5f119b64fc6.png

目录
相关文章
|
26天前
|
Java API 开发者
Jdk动态代理为啥不能代理Class?
该文章主要介绍了JDK动态代理的原理以及为何JDK动态代理不能代理Class。
Jdk动态代理为啥不能代理Class?
|
9月前
|
缓存 Java 数据库连接
分析JDK动态代理的实现
分析JDK动态代理的实现
57 0
|
Java
jdk动态代理实现原理
jdk动态代理实现原理
52 0
|
23天前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
8天前
|
开发者 C# 容器
【独家揭秘】当WPF邂逅DirectX:看这两个技术如何联手打造令人惊艳的高性能图形渲染体验,从环境搭建到代码实践,一步步教你成为图形编程高手
【8月更文挑战第31天】本文通过代码示例详细介绍了如何在WPF应用中集成DirectX以实现高性能图形渲染。首先创建WPF项目并使用SharpDX作为桥梁,然后在XAML中定义承载DirectX内容的容器。接着,通过C#代码初始化DirectX环境,设置渲染逻辑,并在WPF窗口中绘制图形。此方法适用于从简单2D到复杂3D场景的各种图形处理需求,为WPF开发者提供了高性能图形渲染的技术支持和实践指导。
15 0
|
15天前
|
设计模式 Java C++
揭秘!JDK动态代理VS CGLIB:一场关于Java代理界的‘宫心计’,你站哪队?
【8月更文挑战第24天】Java 动态代理是一种设计模式,允许在不改动原类的基础上通过代理类扩展功能。主要实现方式包括 JDK 动态代理和 CGLIB。前者基于接口,利用反射机制在运行时创建代理类;后者采用继承方式并通过字节码技术生成子类实现类的代理。两者在实现机制、性能及适用场景上有明显差异。JDK 动态代理适用于有接口的场景,而 CGLIB 更适合代理未实现接口的类,尽管性能更优但存在一些限制。开发者可根据需求选择合适的代理方式。
44 0
|
3月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
21 0
|
3月前
|
设计模式 Java 程序员
java动态代理(JDK和cglib)
java动态代理(JDK和cglib)
31 0
|
3月前
|
缓存 Java Maven
JDK 动态代理
JDK 动态代理
18 0
|
3月前
|
Java Spring
深入解析Spring源码,揭示JDK动态代理的工作原理。
深入解析Spring源码,揭示JDK动态代理的工作原理。
38 0