当前位置: 首页 > web >正文

java 动态代理

有关Java的动态代理用法,写了一个demo,代码如下:

package com.example.javalib;import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.Type;public class MyClass {public static void main(String[] args) {new MyClass().testProxy();}interface IUserService {void addUser(String username);void deleteUser(int id);String getUser(int id);}private IUserService mUserService = new IUserService() {@Overridepublic void addUser(String username) {System.out.println("addUser:" + username);}@Overridepublic void deleteUser(int id) {System.out.println("删除用户ID:" + id);}@Overridepublic String getUser(int id) {System.out.println("获取用户,ID:" + id);return "代号: " + id;}};private void testProxy() {System.out.println("原来调用流程:");mUserService.addUser("小龙女");mUserService.getUser(9527);System.out.println("------------------------");// 下面动态代理,原有功能不变,加点日志class LoggingHandler implements InvocationHandler {private IUserService target;public LoggingHandler(IUserService target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("begin to invoke method: " + method.getName());long start = System.currentTimeMillis();// 为了原有功能保持不变,所以这里调用原始方法(是否调用原始方法根据业务需要, 甚至可以修改结果,也可以啥都不处理)Object result = method.invoke(target, args);long duration = System.currentTimeMillis() - start;System.out.println("finish invoke method " + method.getName() + ", cost time: " + duration + "ms");return result;}}IUserService proxy = (IUserService) Proxy.newProxyInstance(IUserService.class.getClassLoader(),  new Class[]{IUserService.class}, new LoggingHandler(mUserService));// 模拟的一些实际业务场景,这里我通过反射把mUserService替换了。try {Field field = MyClass.class.getDeclaredField("mUserService");field.setAccessible(true);field.set(MyClass.this, proxy);} catch (Exception e) {e.printStackTrace();}System.out.println("使用动态代理后调用流程:");mUserService.addUser("小龙女");mUserService.getUser(9527);}   
}

打印:

ok. 动态代理可以用于拦截接口调用,修改其实现,或者可以加日志、监控性能、敏感接口权限校验等等。这有利用业务解耦。某些框架也使用到动态代理。缺点就是使用反射对性能有损耗。

http://www.xdnf.cn/news/8892.html

相关文章:

  • 计算机系统简介(一)
  • 使用keil5实现RA4M2按键控制LED的状态
  • java学习记录——MyBatisPlus
  • 结合GIS谈谈Java面向对象(OOP,Object-Oriented Programming)的核心思想
  • redis集群配置
  • 20250525-更新 Anaconda 和 `pip` 中的库包
  • 嵌入式项目之QT页面制作
  • 英伟达破局1000 Token/秒!Llama 4以光速重塑AI推理边界
  • 为什么hash函数能减少哈希冲突
  • C++函数入门:void与int详解
  • 前端融球效果原理讲解+具体实现+模糊度,对比度基础教学
  • AI大模型学习二十八、ACE-Step:生成式AI音乐大模型简介与安装(一)
  • Android 启动流程开发注意事项
  • 蚕豆剥豆机机械原理设计与优化
  • 从零实现智能封面生成器
  • 机器学习课程设计报告 —— 基于口红数据集的情感分析
  • 【Linux网络】UDP套接字【实现英汉转化】
  • Linux Wlan hostapd框架梳理
  • 位运算的小结
  • 第四课 医学影像文献检索思路与方法
  • QPS Qinsy 9.6.5多波束海洋测量软件
  • 疏锦行Python打卡 DAY 11 常见的调参方式
  • 【Java工程师面试全攻略】专栏开篇:从面试流程到基础准备
  • 计算机网络学习20250525
  • Kafka 的日志清理策略:delete 和 compact
  • 【windows】终端/命令行显示中文乱码
  • TCP/IP 协议族
  • 人工智能数学基础实验(一):智能推荐系统实战
  • GPU基础知识
  • 06-Web后端基础(java操作数据库)