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

[Java]动态代理

Java实现动态代理

        Java中的动态代理是一种在运行时动态创建代理类和对象的机制,允许开发者在不修改原类代码的情况下,增加额外的功能。主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现。

准备要求:

1.接口:动态代理要求目标对象必须实现一个或多个接口

2.实现InvocationHandler:这是一个接口,你需要在代理类中实现它,用来定义代理对象在处理方法调用时的行为。

3.Proxy类:这是提供新代理实例的类。它包含静态方法newProxyInstance,用于在运行时创建代理对象。

实现流程:

1. 定义接口:定义一个或多个接口,这些接口将被代理类实现。

2. 实现InvocationHandler:创建一个类实现InvocationHandler接口,并在invoke方法中定义代理逻辑。

3. 创建代理对象:使用Proxy.newProxyInstance方法创建代理对象。

关系示意图:

示例:

1.首先创建被代理对象的接口:

public interface IService {public void sayHello();public void sayGoodbye();
}

2.创建该接口的实现类:

public class ServiceImpl implements IService{@Overridepublic void sayHello() {System.out.println("hello world");}@Overridepublic void sayGoodbye() {System.out.println("goodbye world");}
}

3.编写增强类(实现InvocationHandler接口的类)增强我们的接口实现类:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;//增强类
public class ServiceHandler implements InvocationHandler {//引入需要被增强类的实例对象private Object target;public ServiceHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method: " + method.getName());//通过反射机制来执行原始方法Object result = method.invoke(target, args);System.out.println("After method: " + method.getName());return result;}
}

4.客户端代码:

import java.lang.reflect.Proxy;public class Main {public static void main(String[] args) {//创建被增强类(我的接口的实现类)对象ServiceImpl service = new ServiceImpl();//创建增强类(InvocationHandler接口的实现类)对象ServiceHandler handler = new ServiceHandler(service);//生成代理对象(被增强过的IService实例对象)IService proxy = (IService) Proxy.newProxyInstance(IService.class.getClassLoader(),new Class[]{IService.class},handler);proxy.sayHello();proxy.sayGoodbye();}
}

运行结果:

        可以看到,我们成功地通过动态代理的方式对Service实现了增强。原本只会打印一句"Hello world",现在调用sayHello方法时,还会额外进行两句话地打印。在实际开发中,不一定就只是打印两句话,还可以干更多的事情。 

相关文章:

  • 5.学习笔记-SpringMVC(P61-P70)
  • 3.4/Q1,GBD数据库最新文章解读
  • 抽象工厂模式:创建产品族的设计模式
  • [C#]反射的实战应用,实际数据模拟
  • 机器人项目管理新风口:如何高效推动智能机器人研发?
  • 第七部分:向量数据库和索引策略
  • 养生之道:在岁月里雕琢健康之美
  • 【刷题系列】LeetCode消失的数字、轮转数组
  • 图论---Bellman-Ford算法
  • Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
  • 拼团退款中采用分片处理降低对数据库
  • Java String对象创建过程
  • Rk3568平台通过Jni读取摄像头当前状态值实践案例
  • 【一览表】病理图像处理流程
  • Linux:进程的创建进程的终止
  • ShenNiusModularity项目源码学习(21:ShenNius.Admin.Mvc项目分析-6)
  • 12N60-ASEMI无人机专用功率器件12N60
  • 【多智能体系统组织方式解析】五大架构赋能智能协作
  • 【办公类-89-02】20250424会议记录模版WORD自动添加空格补全下划线
  • Java 调用webservice接口输出xml自动转义
  • 美国证实加拿大及墨西哥汽车零部件免关税
  • 航海王亚洲巡展、工厂店直销……上海多区推出“五五购物节”活动
  • 腾讯重构混元大模型研发体系:成立大语言和多模态模型部,提升AI长期技术作战能力
  • 石家庄:城市更新,生活向美
  • 华侨城A:一季度营收53.63亿元,净利润亏损14.19亿元
  • 广东雷州农商行董事长、原行长同日被查