jdk动态代理实现

jdk动态代理是比较常用的一种代理实现,**它是基于接口的代理。它只能在运行时为接口生成代理对象,所有方法调用都通过一个统一的InvocationHandler处理,是Java标准库自带的代理机制。**核心要点:

  1. 必须要有接口

  2. 运行时动态生成

  3. 通过InvocationHandler统一拦截

  4. JDK自带,无需第三方库

下面的案例简单的进行了实现。

1.接口

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

2.目标类

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

3.jdk代理创建以及调用

java 复制代码
 //目标对象
        Target target = new Target();
        //用来加载在运行期间动态生成的字节码
        ClassLoader loader = testJdkProxy.class.getClassLoader();
        Foo proxy = (Foo) Proxy.newProxyInstance(loader,new Class[]{Foo.class},(p,method,params)->{
            System.out.println("before");
            //目标 方法(参数)
            // 方法.invoke(目标,参数);
            Object result = method.invoke(target,params);
            System.out.println("after");
            return result;//让代理返回目标方法执行的结果
        });
        proxy.foo();

1)创建目标对象

  1. 获取classLoader

3)生成代理对象

设置创建代理需要的参数,同时通过匿名内部类实现InvocationHandler里面的方法进行目标类方法调用前后的增强逻辑处理,目标类方法的调用是通过反射进行。最后返回调用结果。

4)代理对象调用目标方法进行增强

5)总体代码实现

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

import java.lang.reflect.Proxy;

/**
 * @author zhou
 * @version 1.0
 * @description TODO
 * @date 2025/10/25 22:21
 */
public class testJdkProxy {
    interface Foo{
        void foo();
    }
    static class Target implements Foo{
        public void foo(){
            System.out.println("target foo");
        }
    }

    public static void main(String[] args) {
        //目标对象
        Target target = new Target();
        //用来加载在运行期间动态生成的字节码
        ClassLoader loader = testJdkProxy.class.getClassLoader();
        Foo proxy = (Foo) Proxy.newProxyInstance(loader,new Class[]{Foo.class},(p,method,params)->{
            System.out.println("before");
            //目标 方法(参数)
            // 方法.invoke(目标,参数);
            Object result = method.invoke(target,params);
            System.out.println("after");
            return result;//让代理返回目标方法执行的结果
        });
        proxy.foo();
        
    }
}

4.结果

对目标类的方法进行了前后增强。

相关推荐
秋饼31 分钟前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
gCode Teacher 格码致知40 分钟前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工1 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留1 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu1 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说2 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
益莱储中国3 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
紧跟先前的步伐3 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
benchmark_cc4 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu4 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python