JDK动态代理简单实现
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动态代理简单实现相关推荐
- Java JDK 动态代理实现和代码分析
JDK 动态代理 内容 一.动态代理解析 1. 代理模式 2. 为什么要使用动态代理 3. JDK 动态代理简单结构图 4. JDK 动态代理实现步骤 5. JDK 动态代理 API 5.1 java ...
- 利用JDK动态代理机制实现简单拦截器
利用JDK动态代理机制实现简单的多层拦截器 首先JDK动态代理是基于接口实现的,所以我们先定义一个接口 public interface Executer {public Object execute ...
- JDK动态代理实现简单AOP--转
JDK 动态代理是 java 反射的一个重要特性.它在某种方面为 java 提供了动态性的特性,给应用带来了无限的空间.大名鼎鼎的 Hessian . Spring AOP 基于动态代理实现.本文将简 ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- JDK 动态代理的简单理解
http://www.cnblogs.com/luotaoyeah/p/3778183.html JDK 动态代理的简单理解 动态代理 代理模式是 Java 中的常用设计模式,代理类通过调用被代理类的 ...
- 代理模式及JDK动态代理(InvocationHandler)的简单实现与分析
在慕课网上学习了讲解代理模式的一个课程--<模式的秘密--代理模式>,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理, ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- 【原创】分布式之缓存击穿 【原创】自己动手实现静态资源服务器 【原创】自己动手实现JDK动态代理...
[原创]分布式之缓存击穿 什么是缓存击穿 在谈论缓存击穿之前,我们先来回忆下从缓存中加载数据的逻辑,如下图所示 因此,如果黑客每次故意查询一个在缓存内必然不存在的数据,导致每次请求都要去存储层去查询, ...
- 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理
动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...
- jdk动态代理实例和cglib动态代理实例_CGLib 动态代理 原理解析
JDK 动态代理实现与原理 首先来看一段CGLib代理的测试代码(MethodInterceptor的测试, 其他类型这里不做展开了). Util类的代码在后面给出的码云片段中 public 下面的输 ...
最新文章
- GiliSoft Video Editor 13中文版
- C/C++语言变量声明内存分配
- 盘点 GitHub 上那些沙雕项目
- C#不登录电脑启动程序
- windows搭建yolo环境
- 关于联想安装linux系统后无法扫描出wifi网络问题解决方案
- 小米手机Android怎么截屏,小米手机怎么截屏 5种截屏方法分享
- iOS 开发中遇到的各种证书的详细说明以及申请讲解
- java api管理工具_api 接口管理工具
- 计划三年投入十亿资金,统信UOS生态腾飞加速
- 地信实验一利用矢量化软件AutoCAD对栅格文件矢量化
- 浏览器中实现深度学习?有人分析了7个基于JS语言的DL框架
- proteus 上拉电阻
- 三角函数的向量表示的原理计算
- linux启动和服务管理(6)systemd启动过程
- 20 个最值得关注的 2019 互联网女皇报告亮点
- 牛逼吧,微信状态竟然也能赚钱
- Excel如何查找最好业绩成绩的姓名
- 当电力巨头与AI相遇,会发生什么?
- 多人在线游戏技术难点分析