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

jdk动态代理与CGLib动态代理

jdk动态代理

目标对象

package com.study;/*** 目标对象(被代理的对象)**/
public class Target implements TargetInf{public String name;public Target() {}public Target(String name) {this.name = name;}public String buyCola (String name){System.out.println("买了一瓶"+name+"可乐");return "给你可乐";}public void byMilk(){System.out.println("买牛奶");}
}

代理对象

package com.study;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class JDKProxyUtil {public static  TargetInf getProxy(Target target){/** ClassLoader loader,Class<?>[] interfaces,InvocationHandler h*/TargetInf o = (TargetInf)Proxy.newProxyInstance(JDKProxyUtil.class.getClassLoader(),new Class[]{TargetInf.class},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before...");Object o1 = method.invoke(target, args);System.out.println("after...");return o1;}});return o;}
}

测试方法

package com.study;import java.lang.reflect.Proxy;/*** jdk动态代理*/
public class Test {public static void main(String[] args) {TargetInf target = (TargetInf) JDKProxyUtil.getProxy(new Target("Tom"));String 百事 = target.buyCola("百事");System.out.println(百事);target.byMilk();}}

jdk动态代理增强的对象必须要实现接口

CGLib动态代理

目标对象可以不实现接口,也可以实现接口

代理对象

package com.study;import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CGLibProxyUtil {public static  TargetInf getProxy(Target target){Enhancer enhancer = new Enhancer();enhancer.setSuperclass(TargetInf.class);enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("CGLIB Before...");Object res = method.invoke(target, objects);System.out.println("CGLIB After...");return res;}});TargetInf o = (TargetInf) enhancer.create();return o;}
}

测试代码

package com.study;import java.lang.reflect.Proxy;/*** jdk动态代理*/
public class Test {public static void main(String[] args) {Target target1 = new Target("Jerry");TargetInf proxy = CGLibProxyUtil.getProxy(target1);String kekou = proxy.buyCola("可口");System.out.println(kekou);proxy.byMilk();}}

http://www.lryc.cn/news/306390.html

相关文章:

  • Linux 命令行的世界 :4.操作文件和目录
  • 如何使用ArcGIS Pro生成等高线
  • golang学习2,golang开发配置国内镜像
  • Stable Diffusion 绘画入门教程(webui)-ControlNet(线稿约束)
  • 前端笔记——var let const 之间的区别
  • AI工具新革命:从ChatGPT到Sora,生成式AI改变世界
  • C 标准库 - <stdio.h> 详解
  • 支付宝小程序中唤起支付(前后端)
  • AI:139-基于深度学习的语音指令识别与执行
  • 选择 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)
  • Rabbitmq 超时异常解决:PRECONDITION_FAILED - Timeout value used: 1800000 ms.
  • Java架构师之路二、数据库:SQL语言、关系型数据库、非关系型数据库、数据一致性、事务管理等。
  • 【Spring Cloud】高并发带来的问题及常见容错方案
  • springAOP落地实现
  • Linux学习之vi/vim详细介绍
  • 【AIGC大模型】跑通wonder3D (windows)
  • Opencv(2)深浅拷贝与基本绘图(c++python
  • 二叉树与堆
  • 神经网络系列---损失函数
  • LeetCode每日一题 有效的字母异位词(哈希表)
  • 设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践
  • AI新纪元:可能的盈利之道
  • k8s的svc流量通过iptables和ipvs转发到pod的流程解析
  • 【踩坑】修复报错 you should not try to import numpy from its source directory
  • 预测脱碳企业的信用评级-论文代码复现
  • 目标检测——KITTI目标跟踪数据集
  • 25-k8s集群中-RBAC用户角色资源权限
  • Android 面试问题 2024 版(其二)
  • SpringMVC的异常处理
  • 【计算机网络】1 因特网概述