专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

基于Javassist实现Java动态代理

  阅读完本文你能get到的知识点什么是JavassistJDK动态代理使用Javassist实现和JDK一样的效果什么是Javassist
  很多同学估计会对这个词有点陌生,但随着你关注的博主越来越多,知道的也越来越多,马上这篇文章就带你走进Javassist的世界
  Javassist和ASM一样是操作字节码的框架,Javassist诞生于1999年,多少有点年头
  使用Javassist可以在运行时定义一个新类,可以在JVM加载类文件时修改类文件
  而且Javassist提供不同类型的API:源码级别和字节码级别
  本文使用源码级别的API,所以你甚至可以在不懂字节码的前提下使用它,入手相对简单
  但在性能上略逊于ASMJDK动态代理
  话不多说,先来回顾一下我们平时是怎么使用JDK动态代理的Proxy
  JDK提供一个类Proxy用于生成代理类
  调用类方法newProxyInstance,传入的参数ClassLoaderloader:定义代理类的类加载器Classlt;?〔〕interfaces:代理类需要实现的所有接口InvocationHandlerh:调用处理程序,方法调用都会分派到这里
  InvocationHandler
  InvocationHandler是一个接口类,定义了调用方法Objectproxy:生成的代理对象Methodmethod:接口方法实例Object〔〕args:方法调用中传递的参数值
  如何调用
  调用Proxy。newProxyInstance生成代理对象,传入参数接口InvocationHandler实现类的对象处理代理的逻辑
  代码设计
  在动手写代码之前,我们先花几分钟在脑海中设想一下我们需要生成的代理类是什么样子的?
  这里先揭晓了
  假设我们定义了一个接口类LoginService定义的接口类
  那么我们需要生成一个大概是这样的代理类首先必须得实现了定义的接口LoginService接口的所有方法实现都调用都代理到InvocationHandler中
  几个重要的类
  从上面生成的代理类入手,我们生成的类
  继承了父类MObject
  实现了需要代理的接口LoginService
  生成了类成员变量LoginService0,这个对应接口的定义的方法
  实现了需要代理的接口方法login
  还有带参数MInvocationHandler的构造方法MObject
  MObject是生成的代理类需要继承的父类,它的作用是存储了MInvocationHandler(处理程序接口)
  MInvocationHandler
  同JDK自带的接口InvocationHandler,用于实现代理方法的处理逻辑
  MProxy
  同JDK自带的类Proxy
  提供生成代理对象的方法newProxyInstance
  编码开始
  在经过代码设计之后,我们的脑海里应该有思路了,那就开始动手了
  整个过程中比较重要的部分应该就是MProxy类了
  在MProxy里面我们需要实现两大功能:生成代理类字节码根据字节码生成对象生成代理类字节码生成代理类名称生成空类给类设置需要实现的接口添加类成员变量实现接口方法
  生成代理类名称
  这一步相对简单,为了防止生成的代理类重名
  这里拼接了所有需要代理的接口全限定类名,通过字符串连接
  生成空类
  首先我们需要根据新的类名生成一个空的类,注意类名不要重复了,不然会污染了原有的类
  ClassPool:类池,存储所有类的信息,会将类名类信息存储到HashTable里,可通过ClassPool。getDefault()获取实例CtClass:代表一个类classPool。makeClass:生成新的类给类设置需要实现的接口
  这里同样通过ClassPool的get方法获取到所有传入接口的CtClass定义
  再调用setInterfaces方法给生成的类设置多个接口
  添加类成员变量
  因为我们调用MInvocationHandler的invoke方法时需要传入的第二个参数是被代理方法的Method实例
  所以将这个方法的存储到类成员变量中
  CtField代表着一个变量
  传入类型、变量名生成一个CtField实例
  通过setModifiers方法设置变量的修饰符为staticprivate
  因为这里还要设置变量的值
  调用getFieldInitCode生成初始化代码
  为了获取Method对象,这里生成了反射的代码去获取
  实例:Class。forName(类名)。getMethod(方法名,Classlt;?。。。方法的参数类型);
  生成了类成员变量之后,接下来该到实现接口的方法了实现接口方法
  这里需要实现接口的方法
  可以通过CtNewMethod。copy方法去拷贝需要实现的方法,不要直接使用原来的CtMethod,防止污染
  拿到新的CtMethod,我们需要设置它的方法体、设置修饰符为public
  重点来看看怎么生成方法体代码
  这里根据方法返回的类型调用不同的方法void:没有返回值的调用getMethodBodyCodeByVoid基本数据类型:调用getMethodBodyCodeByPrimitive其它类型:调用getMethodBodyCode
  那按顺序来看,不需要返回值的
  那我们需要生成的代码是长这样的
  super。h。invoke(this,对应的类成员变量,newObject〔〕{方法参数});
  这个有个语法需要知道:0代表这方法的第一个参数,懂字节码的应该知道非构造方法的第一个入参是一个隐式的this,指向对象本身
  newObject〔〕{}里面就可以用1112代表着方法的参数了
  返回值是基本数据类型的,需要调用调用包装类型对应的拆箱方法如
  Boolean。parseBoolean()
  所以和上面生成步骤的区别在于前后生成了对于基本类型的parse代码
  最后的返回其它类型的也比较简单
  直接生成强转的代码如(String)
  以上步骤走完,前期准备工作算是做完了,接下来就要根据生成的字节码来实例化对象了根据字节码生成对象
  要根据字节码来生成对象,第一步我们需要编写自定义的类加载器,通过类加载器加载字节码编写自定义加载器MClassLoader,继承类ClassLoader提供add方法将类名映射到对应的字节数组重写ClassLoader类的findClass方法,使用我们生成的字节数组生成类
  在MProxy中调用MClassLoader加载并实例化对象加载类mClassLoader。loadClass(clasName)获取带MInvocationHandler参数类型的构造实例化对象constructor。newInstance(h)
  效果演示
  好了,上面的代码已经编写完了,那么现在就来对比一下JDK自带的Proxy和我们自己实现的Proxy的效果我们定义一个需要代理的接口LoginService
  这里按照Java的基本数据类型以及它们对应的包装类定义了16个接口方法
  分别实现了代理类CusMInvocationHandler和CusJdkInvocationHandler
  这两个代理类的实现是一样的
  区别在于实现的接口一个是我们定义的MInvocationHandler
  另一个是JDK的InvocationHandler
  执行入口类
  Main类分别生成了Proxy和MProxy的代理对象
  然后执行代理对象的各个方法
  来看看实现的效果,左边是JDK的动态代理,右边是使用Javassist实现的动态代理
  作者:MinXie
  链接:https:juejin。cnpost7168030376080703495

在家如何防脱生发?跟着过来人从这两个方面入手,发量暴增!我之前掉发真的还挺严重的,大把大把的掉头发,洗完头卫生间地板上捞起来都是一大坨的头发,头顶两侧也是秃秃的,平时看着不显,但是只要扎头发就能看到两边漏出的头皮,扎起来也只有小拇指那么暗物质在星系中的分布和作用暗物质是一种不与电磁相互作用,难以直接观测到的物质,但是通过引力作用可以对星系的形态和运动产生重要的影响。因此,研究暗物质在星系中的分布和作用是天文学中的一个热门研究方向。在星系形樱你而来醉美湖城丨邀您免费来清镇观赏万亩樱花今天(3月25日)起,由清镇市商务局主办,多彩宝公司承办的樱你而来醉美湖城促消费活动正式启动。此次活动依托清镇市红枫湖万亩樱花园,联动杉杉奥特莱斯吾悦广场时光贵州中环美食广场等消费ArbitrumAirdrop的接收者开始领取ARB代币Arbitrum空投已经开始。正如预期的那样,受益人已开始申请其应得的ARB代币份额。空投还将见证数量为116万个代币,这些代币已以应得的奖励形式妥善保留,供早期用户消费。这些代币2月全球安卓手机好评榜出炉华为排名第五,国产黑马登顶!如今智能手机领域的竞争随着先进制程芯片的更新迭代,走向了白热化的趋势,即便是全球第一的智能手机销量巨头三星也无法在其中占据优势。如今2月全球安卓手机好评榜出炉,三星仅仅占据第九名,安克创新与亚马逊云科技成立联合创新实验室日前,据南方记者了解到,安克创新(Anker)正式同亚马逊云科技成立联合创新实验室,在采用亚马逊云科技服务的基础上,推动安克创新将数据分析机器学习等服务进行规模化应用,赋能业务创新京东e卡回收98折京东e卡是一种预付性质的购物消费卡,京东e卡是一种电商购物卡,京东e卡可以通过信用卡积分兑换获得。众所周知,当我们使用信用卡在指定的商户进行刷卡消费卡,就会产生一定的信用卡积分,积鸿蒙将走向消亡?海外专业机构推测2027年左右,鸿蒙市场份额为0国际机构预测2027年华为鸿蒙系统将消亡!目前全球手机系统市场份额市安卓系统独占鳌头高达81,苹果IOS系统市场份额拿下18,而作为新人的鸿蒙系统只有3亿用户,市场份额只占2,根据不装了?电信巨头爱立信在美认罪,华为谁才是真的脏?不装了?电信巨头爱立信在美认罪,华为谁才是真的脏?一说到华为,置信大家也都晓得,华为是我们中国外乡十分有实力的科技范畴公司,而且,很多朋友们如今用到的手机都是华为公司出品的手机,而俄教授和德演员为长生不老,注射350万年古老细菌探索生命奥秘在人类历史长河中,长生不老是一个让人孜孜以求的梦想,人类从没有停止寻找其灵丹妙药的脚步。来自俄罗斯莫斯科国立大学地质系的冻土学教授阿纳托利布鲁奇科夫采用了一种前所未有的方法来实现这被替代的只会是不被需要的人工智能情感生活科技上一篇等我可以拯救世界的时候专栏链接掰了个掰作者链接奉山公编辑链接胖嘟小方出品链接喜喳喳有声剧社大家好,我是奉山公,今天我们来掰一掰最近火到连胡同口大爷都感兴趣
供需形势向好钢厂盈利有望上行来源中国证券报中国证券报记者董添受下游地产基建恢复速度不及预期等因素影响,钢铁需求不足导致钢材价格持续走低,淡季特征较为明显。近日,中钢协发文呼吁,钢企当前不仅要关注钢铁需求总量的跨界两轮电动车胜算几何来源中国经济网经济日报近年来,随着绿色出行在全球范围内逐渐普及,中国消费者对新能源汽车的接受程度日益提升。在低碳生活的构想中,短距离交通的轻量化选择,让两轮电动车市场拥有了较大的发泯灭31日诡异男子踉跄着,佝偻着身体寻找猎物!第二章病毒爆发海岸边,正在巡逻的海警程风看见不远处的海里漂着一艘渔船程风30岁左右,刚刚大学毕业就加入秦市的海警工作,现在已经是一名海警队长。今天正好赶上他带着实习生们执勤,对于海面上突然出现的安倍之死欧美之痛安倍于2022年7月8日被枪手击中抢救无效死亡,安倍的死确实有点遗憾,拿我们的老话叫逝者为大。我的两个看法。安倍的死中国内地女演员吕丽萍和唐山大学教授石文瑛,澎湃新闻驻日记者曾颖,浪姐一二代回归,3代同台集体玩疯,偶像包袱碎一地千盼万盼,终于等来了浪姐3代同台的画面。第一二季师姐强势回归,她们将帮助第3季姐姐们,完成四公舞台。她们分别是浪1师姐团金晨孟佳李斯丹妮,被网友调侃为半碗宽面。一向比较理性的静姐,中国第一巨人鲍喜顺娶小28岁娇妻,不听劝阻生子,如今怎样了?他身高2。36米,手掌大得像蒲扇,做一身衣服要五米布,是一般人的两倍,他就是被称为中国第一巨人的鲍喜顺。说到中国最高的人,大家首先想到的就是姚明,其实鲍喜顺比姚明还要高出10cm。在三线小城,除了考公务员还能干嘛?前几天我接到一个老同学的电话。很多年没有联系了,蛮意外的。印象中,对方还是嘻嘻哈哈的少年模样,袖子随意卷到胳膊肘,穿着宽松校服活跃在下午四点半的篮球场上。读书的时候我们交集很少。他最新!河南取款难客户将先行垫付,首批15日开始,标准5万元点蓝字关注,不迷路7月11日晚,河南银保监局河南省地方金融监管局发布公告,根据案件查办和资金资产追缴情况,经研究,对禹州新民生村镇银行上蔡惠民村镇银行柘城黄淮村镇银行开封新东方村镇三闯IPO!菊乐股份区域难题待解,还被竞争对手多方位碾压这已经是菊乐股份的第三次闯关了。继20172019年两次失败之后,近日,证监会官网显示,四川菊乐食品股份有限公司(以下简称菊乐股份)向证监会递交了招股说明书,正式开始了它第三次IP妄图继续极限施压!中国警告美方,勿犯葬送台海和平的颠覆性错误文郑敢言二十国集团(G20)外长会在印尼峇里结束后,王毅和布林肯在当地一家酒店举行会谈。两人会前先礼后兵,脱下口罩,亲切握手。两人均表示,中美关系复杂而重要,两国保持正常交往是必要马蓉彻底后悔了,离婚6年后,王宝强和马蓉的区别一目了然马蓉彻底后悔了,离婚6年后,穷得一无所有,缠着王宝强复婚!离婚六年,王宝强和马蓉有什么区别?王宝强和马蓉离婚后,三年半过去了。一儿一女的现状如何?回想六年前,已经身败名裂的马蓉,会
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网