java中的动态代理分为两种

  •         JDK动态代理 只提供接口的代理,不支持类的代理 核心是InvocationHandler和Proxy,在InvocationHandler中通过反射调用目标类的代码。我们可以在其前后加上我们自己的业务。
  •         CGLIB动态代理 如果代理类没有实现InvocationHandler接口,会采用此方式。CGLIB是一个代码类库,可以在运行时动态指定一个类的子信息。覆盖其中的方法并在其中写我们的业务。

CGLIB实现

1.写一个类作为增强对象

/*** @className: UserService* @description: game接口* @date: 2022/07/23* @author: Sora33*/
public class GameService {void playing() {System.out.println("游戏中……");}void eat() {System.out.println("吃饭中……");}}

2.主方法进行测试

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @className: CgLibTest* @description: CgLibTest* @date: 2022/07/23* @author: Sora33*/
public class CgLibTest {private static Logger logger = LoggerFactory.getLogger(CgLibTest.class);public static void main(String[] args) {GameService gameService = new GameService();// 创建一个增强器类Enhancer enhancer = new Enhancer();// 设置父类,可以理解为我们增强的类enhancer.setSuperclass(GameService.class);// 设置callback属性enhancer.setCallback(new MethodInterceptor() {// 重写interceptor方法@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {boolean methodName = method.getName().equals("playing");if (methodName) {// 如果是正在玩游戏就执行此逻辑logger.info("正在检测状态");methodProxy.invoke(gameService, objects);logger.info("游戏结束");return null;} else {logger.info("正在检测状态");methodProxy.invoke(gameService, objects);logger.info("并没有玩游戏");return null;}}});GameService game = (GameService)enhancer.create();game.playing();game.eat();}
}

3.执行结果

10:30:35.334 [main] INFO com.sora.CgLibTest - 正在检测状态
游戏中……
10:30:35.347 [main] INFO com.sora.CgLibTest - 游戏结束
10:30:35.347 [main] INFO com.sora.CgLibTest - 正在检测状态
吃饭中……
10:30:35.347 [main] INFO com.sora.CgLibTest - 并没有玩游戏

JDK实现

1.先建一个car的接口

public interface Car {void run();
}

2.然后是实现类

public class CarImpl implements Car {@Overridepublic void run() {System.out.println("准备上高速");}
}

3.(关键)写一个类,实现InvocationHandler接口

invoke是执行接口中的方法。我们需要在前后加上我们自己的操作

public class MyInvokeTest implements InvocationHandler {private Object object;public MyInvokeTest(Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 前置操作System.out.println("车子正在启动");// 执行方法Object invoke = method.invoke(object, args);// 后置操作System.out.println("到达目的地");return invoke;}
}

4. 写一个测试类进行测试

public class JDKTest {public static void main(String[] args) {// 创建car实现类对象CarImpl car = new CarImpl();// 创建InvocationHandler对象InvocationHandler invocationHandler = new MyInvokeTest(car);// 代理Car instance = (Car)Proxy.newProxyInstance(car.getClass().getClassLoader(), // 类加载器car.getClass().getInterfaces(), // 目标接口invocationHandler);     // 完成代理模式的处理器// 执行instance.run();}
}

5.打印结果

车子正在启动
准备上高速
到达目的地

更多知识请移步个人博客:33sora.com

JDK动态代理简单实现相关推荐

  1. Java JDK 动态代理实现和代码分析

    JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...

  2. 利用JDK动态代理机制实现简单拦截器

    利用JDK动态代理机制实现简单的多层拦截器 首先JDK动态代理是基于接口实现的,所以我们先定义一个接口 public interface Executer {public Object execute ...

  3. JDK动态代理实现简单AOP--转

    JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...

  4. JDK动态代理和CGLib动态代理简单演示

    JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...

  5. JDK 动态代理的简单理解

    http://www.cnblogs.com/luotaoyeah/p/3778183.html JDK 动态代理的简单理解 动态代理 代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的 ...

  6. 代理模式及JDK动态代理(InvocationHandler)的简单实现与分析

    在慕课网上学习了讲解代理模式的一个课程--<模式的秘密--代理模式>,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理, ...

  7. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  8. 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理...

    [原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询, ...

  9. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理

    动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...

  10. jdk动态代理实例和cglib动态代理实例_CGLib 动态代理 原理解析

    JDK 动态代理实现与原理 首先来看一段CGLib代理的测试代码(MethodInterceptor的测试, 其他类型这里不做展开了). Util类的代码在后面给出的码云片段中 public 下面的输 ...

最新文章

  1. GiliSoft Video Editor 13中文版
  2. C/C++语言变量声明内存分配
  3. 盘点 GitHub 上那些沙雕项目
  4. C#不登录电脑启动程序
  5. windows搭建yolo环境
  6. 关于联想安装linux系统后无法扫描出wifi网络问题解决方案
  7. 小米手机Android怎么截屏,小米手机怎么截屏 5种截屏方法分享
  8. iOS 开发中遇到的各种证书的详细说明以及申请讲解
  9. java api管理工具_api 接口管理工具
  10. 计划三年投入十亿资金,统信UOS生态腾飞加速
  11. 地信实验一利用矢量化软件AutoCAD对栅格文件矢量化
  12. 浏览器中实现深度学习?有人分析了7个基于JS语言的DL框架
  13. proteus 上拉电阻
  14. 三角函数的向量表示的原理计算
  15. linux启动和服务管理(6)systemd启动过程
  16. 20 个最值得关注的 2019 互联网女皇报告亮点
  17. 牛逼吧,微信状态竟然也能赚钱
  18. Excel如何查找最好业绩成绩的姓名
  19. 当电力巨头与AI相遇,会发生什么?
  20. 多人在线游戏技术难点分析

热门文章

  1. 基于三菱PLC的全自动洗衣机控制系统设计
  2. 宏基v3-571G拆机
  3. 京东数据分析SQL面试题
  4. 从零开始的立绘拆包教程
  5. SSM框架-小区物业管理系统(附源码)
  6. c语言实验11实验报告,c语言 实验报告11 12.doc
  7. linux 虚拟示波器,模拟示波器怎么看频率,模拟示波器频率计算
  8. 《白帽子讲web安全》第一篇 世界观安全
  9. Java项目:ssm电影院购票系统
  10. 浅析视频云行业及实现技术