jdk动态代理的实现原理

下面的案例将一步步的模拟jdk源码思路实现jdk动态代理。

一.原始思路

1.目标类

java 复制代码
package com.example.demo2.b08;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/27 22:04
 */
public class b08 {
    interface Foo{
        void foo();
    }
    static class Target implements Foo{

        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

    public static void main(String[] params) {
        Foo proxy = new $Proxy0();
        proxy.foo();
    }
}

2.代理类

java 复制代码
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/27 22:06
 */
public class $Proxy0 implements b08.Foo {


    @Override
    public void foo() {
        //功能增强
        System.out.println("before....");

        //调用目标
        new Target().foo();
    }
}

3.结果

二.初步改进

引入InvocationHandler接口,在创建代理的时候再定义实现,这样不用一开始就写死在代理类中。

1.接口

java 复制代码
    interface Foo{
        void foo();
    }
    interface InvocationHandler{
        void invoke();
    }

2.目标类

java 复制代码
   static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

3.代理类

java 复制代码
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
import com.example.demo2.b08.b08.InvocationHandler;
/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/27 22:06
 */
public class $Proxy0 implements b08.Foo {

    private InvocationHandler h;
    public $Proxy0(InvocationHandler h){
        this.h = h;
    }
    @Override
    public void foo() {
        h.invoke();
    }
}

4.主类

java 复制代码
    public static void main(String[] params) {
        Foo proxy = new $Proxy0(new InvocationHandler() {
            @Override
            public void invoke() {
                //功能增强
                System.out.println("before....");
                //调用目标
                new Target().foo();
            }
        });
        proxy.foo();
    }

5.结果

三.改进二

如果有两个方法需要实现代理功能,上面的方法就不适用了。需要进一步改进,在调用invoke方法时候需要把方法信息传入,根据方法的信息执行对应的增强。

java 复制代码
  interface Foo{
        void foo();
        void bar();
    }
    interface InvocationHandler{
        void invoke(Method method,Object[] args) throws Throwable;
    }
    static class Target implements Foo{
        @Override
        public void foo() {
            System.out.println("target foo");
        }

        @Override
        public void bar() {
            System.out.println("target bar");
        }
    }

2.代理类

java 复制代码
package com.example.demo2.b08;
import com.example.demo2.b08.b08.Target;
import com.example.demo2.b08.b08.InvocationHandler;
import java.lang.reflect.Method;
import com.example.demo2.b08.b08.Foo;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/27 22:06
 */
public class $Proxy0 implements b08.Foo {

    private InvocationHandler h;
    public $Proxy0(InvocationHandler h){
        this.h = h;
    }
    @Override
    public void foo() {
        Method foo = null;
        try {
            foo = Foo.class.getMethod("foo");
            h.invoke(foo,new Object[0]);
        } catch (Throwable e) {
            e.printStackTrace();
        }

    }

    @Override
    public void bar() {
        Method bar = null;
        try {
            bar = Foo.class.getMethod("bar");
            h.invoke(bar,new Object[0]);
        } catch (Throwable e) {
            e.printStackTrace();
        }

    }
}

3.主类

java 复制代码
public static void main(String[] params) {
        Foo proxy = new $Proxy0(new InvocationHandler() {
            @Override
            public void invoke(Method method, Object[] args) throws Throwable {
                //功能增强
                System.out.println("before....");
                //调用目标
                method.invoke(new Target(),args);
            }
        });
        proxy.foo();
        proxy.bar();
    }

4.结果

上面是对源码的思路简单进行模拟,真实的源码实现比这更复杂,考虑的情况更多。

相关推荐
Dicky-_-zhang1 分钟前
Java并发编程实战:线程池与并发工具类
java·jvm
Rust研习社1 分钟前
Rust 官方拟定 LLM 政策,防止 LLM 污染开源社区?
开发语言·后端·ai·rust·开源
devilnumber1 分钟前
JDK6→JDK7→JDK8 重点技术更新(精简背诵版)
java
云烟成雨TD3 分钟前
Spring AI Alibaba 1.x 系列【61】Graph 持久化执行
java·人工智能·spring
muqsen3 分钟前
Java 分布式相关面试题总结
java·开发语言·分布式
做个文艺程序员5 分钟前
第02篇:搭建 ES 集群 + Spring Boot 整合实战——从 Docker Compose 到 Java 客户端全覆盖
java·spring boot·elasticsearch
Jinkxs6 分钟前
LoadBalancer- 简单限流策略:Nginx 基于连接 / 请求的限流实现
java·运维·nginx
fenglllle13 分钟前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
计算机安禾14 分钟前
【c++面向对象编程】第44篇:typename与class的区别,依赖类型名与template消除歧义
java·jvm·c++
froginwe1115 分钟前
Scala 正则表达式
开发语言