跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Java 动态代理 Proxy 实现原理与示例

综述由AI生成Java 动态代理通过 InvocationHandler 接口和 Proxy 类实现,允许在运行时为指定接口生成代理对象。示例展示了如何拦截方法调用并过滤黑名单关键词(如 movie、game)。相比静态代理,动态代理更灵活,无需为每个类编写代理代码。核心逻辑在于 invoke 方法中判断参数是否包含敏感词,决定是放行还是拒绝访问。该模式常用于日志记录、权限控制等场景。

涅槃凤凰发布于 2025/1/17更新于 2026/5/2613 浏览
Java 动态代理 Proxy 实现原理与示例

动态代理是对原有功能的增强;静态代理限定了只能是一个类,而动态代理可以根据传入的对象类型来生成对应类型的代理对象。

动态代理实现

实现 InvocationHandler 接口并重写其方法,该方法即为代理类的增强方法。

public class KeywordFilter implements InvocationHandler {
    private Object origin; // 被代理的真实对象
    private List<String> blackList = Arrays.asList("movie", "game");

    public KeywordFilter(Object origin) {
        this.origin = origin;
        System.out.println("代理对象已经被注入" + origin);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        String arg = args[0].toString();
        for (String keyword : blackList) {
            if (arg.contains(keyword)) {
                System.out.println("forbidden" + arg);
                return null;
            }
        }
        Object invoke = method.invoke(origin, arg);
        return invoke;
    }
}
public class Modem implements Internet {
    @Override
    public void  {
        System.out.println( + url);
    }
}
access
(String url)
"正在访问"

生成动态代理:

public static void main(String[] args) {
    Internet proxy = (Internet) Proxy.newProxyInstance(
        Modem.class.getClassLoader(),
        Modem.class.getInterfaces(),
        new KeywordFilter(new Modem())
    );
    proxy.access("http://www.baidu.com");
    proxy.access("http://www.movie.com");
    proxy.access("http://www.game.com");
    proxy.access("http://www.waterkid.com");
}

目录

  1. 动态代理实现
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Whisper-large-v3 云端部署详细步骤
  • C++ 异常处理:核心机制、自定义体系与实战
  • 谷歌开发者社区生态解析:助力开发者全球成长
  • React Native 侧滑列表实战:SwipeableFlatList 使用详解
  • 基于 Ollama 与 Qwen 的本地医疗大模型应用实践
  • Gerrit 配置:Gitweb 集成
  • Git-AI:追踪 AI 生成代码的实用工具
  • 如何精准引导 ChatGPT 构建定制化 GPTs 应用
  • Flutter 跨平台开发学习指南:从 Dart 基础到实战项目
  • DCU BW1000 环境部署 llama.cpp 推理 Qwen3-Coder 模型实战复盘
  • 数据结构:堆与优先级队列
  • GitHub 上最受欢迎的 7 大 Claude Skills 开源 AI 技能库
  • 前端静态站点生成(SSG)技术解析
  • PyCharm 在 macOS 系统下的安装与基础配置指南
  • iOS 设备管理工具与越狱助手精选
  • Python 字典子类的设计与实现
  • llama.cpp 量化模型部署实战:从模型转换到 API 服务
  • Python 数据科学工具链入门:NumPy、Pandas、Matplotlib 快速上手
  • 前端拖拽交互实现:从原生 API 到专业库
  • Ubuntu 22.04下libwebkit2gtk-4.1-0安装指南

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online