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

【Java】jdk动态代理

一,概述

jdk动态代理,指通过Proxy.newProxyInstance方法回来的实例对象,通过InvokeHandler接口实现切片编程的方式。

此为代理模式,能在不改变原类的基础上,对类实现前置、后置增强,最小化嵌入功能逻辑,实现解耦。

注意,此方式只能代理实现接口的类,它的实现原理是生成一个接口简单实例类的字节码,通过ClassLoader.defin方法解析生成的字节码,得到一个Proxy Class。

二,实例

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyMain {//接口定义public interface IAction {int action(String type);}public static class ActionImpl implements IAction {@Overridepublic int action(String type) {System.out.println("type=" + type);return 0;}}public static void main(String[] args) {ActionImpl action = new ActionImpl();IAction proxyInstance = (IAction) Proxy.newProxyInstance(action.getClass().getClassLoader(), new Class[]{IAction.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("action")) {//前置增强System.out.println("before fly");//原类逻辑int result = action.action((String) args[0]);//后置增强System.out.println("after fly");return result;}return null;}});//代理方法proxyInstance.action("fly");}
}

输出

三,原理

跟进Proxy.newProxyInstance方法查看,

1,返回一个构造器,此处已经生成了对应Stub Class,因此该方法内部有字节码生成逻辑,

2,通过构造器反射创建一个实例,

跟进getProxyConstructor

享元模式设计,缓存对象。

随后,通过ProxyBuilder的build方法,生成一个构造器,跟进

1,生成了一个Class,

2,根据方法参数返回一个构造器

跟进defineProxyClasss

1,通过ProxyGenerator方法,生成字节码,

2,通过字节码生成一个Class,

跟进generatorProxyClass

1,hashcode,equals,toString方法生成

2,接口方法生成

关于字节码生成的具体过程,本文不再跟进。以上,即jdk动态代理实现的原理。

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

相关文章:

  • Flink02-学习-套接字分词
  • Web前端开发:CSS Float(浮动)与 Positioning(定位)
  • 数据结构——二叉树和堆(万字,最详细)
  • 【AI论文】RefVNLI:迈向可扩展的主题驱动文本到图像生成评估
  • SLAM技术:从原理到应用的全面解析
  • 计算机网络 | 应用层(6) -- 套接字编程
  • Java自定义注解详解
  • 「Mac畅玩AIGC与多模态01」架构篇01 - 展示层到硬件层的架构总览
  • 深度学习常见框架:TensorFlow 与 PyTorch 简介与对比
  • 在 Ubuntu 24.04 系统上安装和管理 Nginx
  • body Param Query 三个 不同的入参 分别是什么意思 在前端 要怎么传 这三种不同的参数
  • DAY7-C++进阶学习
  • Python爬虫课程实验指导书
  • 麒麟系统搭建离线NTP服务器,让局域网内windows系统同步其时间,并付排错避坑思路
  • Android Studio中创建第一个Flutter项目
  • 前端性能优化面试回答技巧
  • django admin 去掉新增 删除
  • 【愚公系列】《Manus极简入门》005-DeepSeek与Manus的创新之处
  • PostSwigger Web 安全学习:CSRF漏洞3
  • C# 利用log4net 工作台打印和保存到文件
  • 央视两次采访报道爱藏评级,聚焦生肖钞市场升温,评级币成交易安全“定心丸”
  • C# 类的基本概念(类成员)
  • 16bit 高精度低延时霍尔角度编码器,KTH7824,替代MA730
  • 高自由度与多功能指尖设计:Allegro灵巧手V5(4F Plus)的技术亮点
  • 电商数据采集电商,行业数据分析,平台数据获取|稳定的API接口数据
  • 榕壹云国际版短剧系统:基于Spring Boot+MySQL+UniApp的全球短剧创作平台
  • Scala 函数柯里化及闭包
  • 用 Nodemon 解决 npm run serve 频繁重启服务
  • 2个小时1.5w字| React Golang 全栈微服务实战
  • 双目RealSense系统配置rs_camera.launch----实现D435i自制rosbag数据集到离线场景的slam建图