天天观焦点:什么是代理?java中的动态代理技术是什么?
代理的概念
(相关资料图)
动态代理技术是整个java技术中非常重要的一个技术,它是学习Spring的框架的基础,不会动态代理技术,那么在学习Spring这些框架时是学不明白的。
动态代理技术就是用来产生一个对象的代理对象的。
在开发中为什么需要为一个对象产生代理对象呢?
举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,
当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人。
比如刘德华在现实生活中非常有名,会唱歌,会跳舞,会拍戏,刘德华在没有出名之前,我们可以直接找他唱歌,跳舞,拍戏,
刘德华出名之后,他干的第一件事就是找一个经纪人,这个经纪人就是刘德华的代理人(代理),当我们需要找刘德华表演时,不能直接找到刘德华了(刘德华说,你找我代理人商谈具体事宜吧!),只能是找刘德华的代理人,因此刘德华这个代理人存在的价值就是拦截我们对刘德华的直接访问!
这个现实中的例子和我们在开发中是一样的,我们在开发中之所以要产生一个对象的代理对象,主要用于拦截对真实业务对象的访问。
·
那么代理对象应该具有什么方法呢?
代理对象应该具有和目标对象相同的方法。
所以在这里明确代理对象的两个概念:
1、代理对象存在的价值主要用于拦截对真实业务对象的访问。
2、代理对象应该具有和目标对象(真实业务对象)相同的方法。
·
刘德华(真实业务对象)会唱歌,会跳舞,会拍戏,我们现在不能直接找他唱歌,跳舞,拍戏了,只能找他的代理人(代理对象)去实现唱歌,跳舞,拍戏的需求,
一个人要想成为刘德华的代理人,那么他必须具有和刘德华一样的行为(会唱歌,会跳舞,会拍戏),刘德华有什么方法,他(代理人)就要有什么方法,我们找刘德华的代理人唱歌,跳舞,拍戏,
但是代理人不是真的懂得唱歌,跳舞,拍戏的,真正懂得唱歌,跳舞,拍戏的是刘德华,
在现实中的例子就是我们要找刘德华唱歌,跳舞,拍戏,那么只能先找他的经纪人,交钱给他的经纪人,然后经纪人再让刘德华去唱歌,跳舞,拍戏。
·
二、java中的代理
2.1、"java.lang.reflect.Proxy"类介绍
现在要生成某一个对象的代理对象,这个代理对象通常也要编写一个类来生成,所以首先要编写用于生成代理对象的类。
在java中如何用程序去生成一个对象的代理对象呢?
java在JDK1.5之后提供了一个"java.lang.reflect.Proxy"类,通过"Proxy"类提供的一个newProxyInstance方法用来创建一个对象的代理对象,
如下所示:
static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)
newProxyInstance方法用来返回一个代理对象,这个方法总共有3个参数,
ClassLoader loader用来指明生成代理对象使用哪个类加载器,
Class[] interfaces用来指明生成哪个对象的代理对象,通过接口指定,
InvocationHandler h用来指明产生的这个代理对象要做什么事情。
所以我们只需要调用newProxyInstance方法就可以得到某一个对象的代理对象了。
·
2.2、编写生成代理对象的类
在java中规定,要想产生一个对象的代理对象,那么这个对象必须要有一个接口,所以我们第一步就是设计这个对象的接口,在接口中定义这个对象所具有的行为(方法)
1、定义对象的行为的接口
/** *@ClassName Person * @Description 代理接口 */public interface Person{ /** * @Method sing * @Description 唱歌 * @param name * @return */ String sing(String name); /** * @Mathod dance * @Description 跳舞 * @param name * @return */ String dance(String name);}
2、真实对象类
/** * @ClassName LiuDeHua * @Desrition 刘德华实现Person类实现唱歌,跳舞行为 */public class LiuDeHua implements Person{ @Override public String sing(String name) { System.out.println("刘德华唱"+name+"歌"); return "歌唱完了"; } @Override public String dance(String name) { System.out.println("刘德华跳"+name+"w舞蹈"); return "舞蹈跳完了"; }}
3、代理类
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/*** @ClassName LuiDeHuaProxy* @Desrition 这个类实现刘德华代理类*/public class LuiDeHuaProxy { //真实对象类 private Person person = new LiuDeHua(); public Person getProxy() { //生成一个对象的代理对象 return (Person) Proxy.newProxyInstance(LuiDeHuaProxy.class.getClassLoader()/*代理类的加载*/ , person.getClass().getInterfaces()/*Class对象数组,实现接口对象*/, new InvocationHandler()/*调用处理器*/ { /** * InvocationHandler接口只定义了一个invoke方法,因此对于这样的接口,我们不用单独去定义一个类来实现该接口, *而是直接使用一个匿名内部类来实现该接口,new InvocationHandler() {}就是针对InvocationHandler接口的匿名实现类 * 在invoke方法中,编写代码,指定返回的代理对象干的工作 * proxy : 把代理对象自己传递进来 * method:把代理对象当前调用的方法传递进来 * args:把方法参数传递进来 * 当调用代理对象的person.sing("冰雨");或者 person.dance("江南style");方法时, * 实际上执行的都是invoke方法里面的代码, * 因此我们可以在invoke方法中使用method.getName()就可以知道当前调用的是代理对象的哪个方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("sing")) { //如果调用的是代理人对象的sing方法 System.out.println("我是刘德华的代理人,要找刘德华唱歌需要一百万!!"); //已经交钱,代理人自己不会唱歌就只能找刘德华唱歌了 //代理对象调用真实目标对象的sing方法去处理用户请求 return method.invoke(person, args); } if(method.getName().equals("dance")){ //如果调用的是代理人对象的dance方法 System.out.println("我是刘德华的代理人,要找刘德华跳舞需要一百万!!"); //已经交钱,代理人自己不会跳舞就只能找刘德华跳舞了 //代理对象调用真实目标对象的dance方法去处理用户请求 return method.invoke(person, args); } return null; } }); }}
4、测试
public class Test { public static void main(String[] args){ LuiDeHuaProxy luiDeHuaProxy = new LuiDeHuaProxy(); Person person = luiDeHuaProxy.getProxy(); System.out.println(person.sing("大海")); System.out.println(person.dance("啊啊")); }}
标签:
相关推荐:
最新新闻:
- 全球微资讯!黑苹果怎么安装驱动显卡?黑苹果驱动显卡的两种方案推荐
- win11系统怎么下载安卓APP?安装安卓软件方法:焦点报道
- 天天观焦点:什么是代理?java中的动态代理技术是什么?
- 保密文件柜是什么?保密柜与保险柜有什么区别?
- 迅雷快鸟家庭宽带提速的原理是什么?迅雷快鸟宽带提速的原理 天天观天下
- 环球焦点!mysql中的死锁如何优化?mysql之锁优化
- 如何查看chromebook刷机辅助功能?Chromebook辅助功能指南
- 如何判断iPhone是否存在浸液损坏?iPhone液触指示器位置-天天头条
- 厨房灶具有哪些品牌?厨房灶具十大品牌推荐
- 全球看点:教你如何一键刷机?蘑菇云刷机视频详细教程
- 免费个人网站怎么建立?个人网站建立流程
- 如何在linux下进行路由器限速?教你用linux做路由器限速
- 环球实时:i7处理器好吗?电脑真的是i7要比i5好吗?
- 【环球新要闻】雅本化学04月12日获深股通增持5.79万股
- 世界报道:东菱电烤箱好不好?东菱电烤箱牌子介绍
- 解析力碾压iPhone 14 Pro Max!小米13 Ultra手机镜头绝了:世界热点
- 环球热推荐:入门游戏鼠标 G102不到百元
- 苹果智能戒指要来了?大量技术专利曝光,动动手就能实现隔空交互 环球滚动
- 家庭布线 磊科5口千兆交换机29元|环球资讯
- 环球今头条!郭明琪:iPhone15 Pro和PM将继续实体按键
- 蔚来再砍新车免费权益,取消免费家充桩,并调整免费换电次数|快讯
- 《红霞岛》主机首发仅有质量模式:XSX支持4K30FPS
- 《CS:GO》主播直播时天花板塌了 直播效果拉满 世界资讯
- 携热管理新品亮相2023上海车展 美的威灵汽车部件“强链”中国新能源汽车
- 数论知识点总结_关于数论的一些基础知识
- 《王者荣耀》新英雄姬小满技能演示:主打一个背口诀 天天实时
- 杨幂新剧《哈尔滨1944》开机路透照 大波浪配皮风衣_天天快讯
- RTX 4070零售价4799元起 Remix Runtime开源《反恐精英2》支持NVIDIA Reflex 环球简讯
- 颜值爆表性能超3080!AX电竞叛客RTX4070 X3W OC首发
- 全球快资讯:集齐五虎上将召唤冰龙!映众RTX4070全系首发
- 极客武装!七彩虹iGame GeForce RTX 4070系列显卡齐亮相
- 焦点快报!点燃新战场 铭瑄GeForce RTX 4070同步发布
- RTX 4070显卡正式发布:4799元起 众多非公版本周发布 世界快消息
- 女子疯狂网上购物确诊帕金森:过度伤害性冲动行为
- 《三位一体5》公布首支预告!预计将于今年夏季发售
- 世界热门:华为畅享60X外观公布:神似Mate 50!
- 小米13 Ultra官宣18日发布 12s Ultra现4999清仓 看热讯
- 当前热讯:AMD:显卡的显存容量和性能同样重要
- 《生化》三女主都未变老引热议 网友:全感染了病毒
- 世界热资讯!荣归故里!杨紫琼回马来西亚带奥斯卡小金人扫墓
- 小米13 Ultra将首发徕卡Summicron镜头
- 产业群策群力推动PC低碳转型 中国电子学会绿色计算机标准工作组宣布成立
- 小米13 Ultra曝标配两颗长焦镜头-报资讯
- 焦点信息:南京公交司机敬老,受助老人敬礼
- 大熊猫丫丫回国细节披露 由美国联邦快递直送上海
- B社《DOOM》手游《Mighty DOOM》IGN 5分:氪金游戏 别玩!
- 全国联保!新飞双开门冰箱仅需308元
- 安卓新功能可实现APP自动存档,再也不用担心手机空间不够
- 小米13 Ultra再预热:号称镜头解析力优于苹果iPhone 14 Pro Max
- 一文读懂ROG游戏手机7系列首发福利 轻松拿下超值大礼
- 古越龙山(600059.SH)发布2022年度业绩,净利润2.02亿元,同比增长0.7%,拟10派0.8元 全球讯息
- 世界热门:比《暗黑破坏神4》还多!暴雪新作《奥德赛》招聘职位高达59个
- 卷起来了!已有人2小时内速通《生化危机4:重制版》最高难度
- 破坏游戏体验!《守望先锋2》新英雄可用来坑队友_热推荐
- 宝可梦卡牌高价引发多起盗案 盗匪与时俱进好偷还贵_每日动态
- 今日热文:羡煞众人!男子年会抽中365天带薪休假奖:可折现
- 试用期员工因没跑完5公里被辞 公司:没有吃苦耐劳精神
- 汇聚生态之力,英特尔以网络与边缘技术连结可持续数字化未来:焦点信息
- 英特尔携生态伙伴推进技术创新深化,助数据中心可持续发展
- 天天热推荐:京东3C数码商家交流暨招商会在深圳圆满举行 携手商家共创增长
- 电脑电源,不止插拔那么简单
- 当前要闻:你电脑里的这个板子,其实是一座“矿山”
- 英维克:公司已在互动易“公司声音”公布上月底的股东户数,您可前往了解相关信息
- 天天日报丨三上真司离职后还在宣传:恭喜《幽灵线:东京》更新发布
- 即时:东方游戏文化周开启 多款游戏低价优惠
- 首批名单公布!赣州这些药店纳入职工门诊统筹_视点
- 【天天新视野】无法克服技术难题!iPhone15或将取消固态按键设计
- XSX版《幽灵线:东京》M站84分 值得重玩一遍!
- 动态焦点:COD19新赛季中文预告:人气角色登场 系列神枪回归
- NASA公开火星生活设施 6月开启完全火星模拟实验_全球报资讯
- 《异形:火力精英》将于4月26日推出Switch云版本
- Xbox手柄定制服务推出精英手柄二代定制 更多颜色可选-环球速读
- 发售一年后 《幽灵线:东京》确认添加D加密:看点
- 生化危机4重制版佣兵模式怎么解锁?生化危机4佣兵模式在哪开?
- 东方甄选奖励154员工8.83亿港元 董宇辉或被奖励超千万
- 最新:小米13 Ultra样张首曝光:比单反都厉害了?
- 6099元!华硕天选 X 2023台式机今晚开卖:13代i5+RTX 3060
- 一个帮助孩子独立的“小妙招”,全家都爱了
- 人工智能助力全球经济回暖 科大讯飞亮相消博会
- 宣化区赵川镇:学习村规民约,助力乡风文明
- 青春回忆!《灌篮高手》成平台首部想看破百万的进口动画:环球热推荐
- 《暗黑破坏神4》将每季度推出新故事内容 内容丰富值得期待
- 立达信:2022年归母净利同比增64.04%至4.94亿元 每日聚焦
- 每日速看!中国电信第四代云手机:天翼一号2023款通过国内认证,68W快充
- 首款骁龙 8+ Gen 1平板电脑,中兴Axon Pad硬件规格曝光