范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

基于Javassist实现Java动态代理

  阅读完本文你能 get 到的知识点什么是 JavassistJDK 动态代理使用 Javassist 实现和 JDK 一样的效果什么是Javassist
  很多同学估计会对这个词有点陌生,但随着你关注的博主越来越多,知道的也越来越多,马上这篇文章就带你走进 Javassist 的世界
  Javassist 和 ASM 一样是操作字节码的框架, Javassist 诞生于 1999 年,多少有点年头
  使用 Javassist 可以在运行时定义一个新类,可以在 JVM 加载类文件时修改类文件
  而且 Javassist 提供不同类型的API: 源码级别 和 字节码级别
  本文使用源码级别的 API ,所以你甚至可以在不懂字节码的前提下使用它,入手相对简单
  但在性能上略逊于 ASMJDK 动态代理
  话不多说,先来回顾一下我们平时是怎么使用 JDK 动态代理的Proxy
  JDK 提供一个类 Proxy 用于生成代理类
  调用类方法 newProxyInstance,传入的参数ClassLoader loader : 定义代理类的类加载器Class<?>[] interfaces : 代理类需要实现的所有接口InvocationHandler h : 调用处理程序,方法调用都会分派到这里
  InvocationHandler
  InvocationHandler 是一个接口类,定义了调用方法Object proxy : 生成的代理对象Method method : 接口方法实例Object[] args : 方法调用中传递的参数值
  如何调用
  调用 Proxy.newProxyInstance 生成代理对象, 传入参数接口InvocationHandler实现类的对象处理代理的逻辑
  代码设计
  在动手写代码之前,我们先花几分钟在脑海中设想一下我们需要生成的代理类是什么样子的?
  这里先揭晓了
  假设我们定义了一个接口类 LoginService定义的接口类
  那么我们需要生成一个大概是这样的代理类首先必须得实现了定义的接口 LoginService接口的所有方法实现都调用都代理到 InvocationHandler 中
  几个重要的类
  从上面生成的代理类入手,我们生成的类
  继承了父类 MObject
  实现了需要代理的接口 LoginService
  生成了类成员变量 LoginService_0, 这个对应 接口的定义的方法
  实现了需要代理的接口方法 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 方法设置变量的修饰符为 static + private
  因为这里还要设置变量的值
  调用 getFieldInitCode 生成初始化代码
  为了获取 Method 对象 ,这里生成了反射的代码去获取
  实例: Class.forName(类名).getMethod(方法名, Class<?>... 方法的参数类型);
  生成了类成员变量之后,接下来该到实现接口的方法了实现接口方法
  这里需要实现接口的方法
  可以通过 CtNewMethod.copy 方法去拷贝需要实现的方法,不要直接使用原来的 CtMethod , 防止污染
  拿到新的 CtMethod ,我们需要设置它的方法体、设置修饰符为 public
  重点来看看怎么生成方法体代码
  这里根据方法返回的类型调用不同的方法void : 没有返回值的 调用 getMethodBodyCodeByVoid基本数据类型 : 调用 getMethodBodyCodeByPrimitive其它类型 : 调用 getMethodBodyCode
  那按顺序来看,不需要返回值的
  那我们需要生成的代码是长这样的
  super.h.invoke(this, 对应的类成员变量, new Object[]{方法参数});
  这个有个语法需要知道: $0 代表这方法的第一个参数,懂字节码的应该知道非构造方法的第一个入参是 一个隐式的 this ,指向对象本身
  new Object[]{} 里面就可以用 11 12 代表着方法的参数了
  返回值是基本数据类型的,需要调用调用包装类型对应的拆箱方法 如
  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.cn/post/7168030376080703495

成绩超越苏炳添!广东00后小将夺冠16日晚2023年全国室内田径锦标赛天津站男子60米决赛中来自广东田径队的00后小将陈冠锋跑出6秒55夺冠并刷新了此前由苏炳添创造的2023赛季亚洲男子室内60米最佳成绩广东田径新好飒!张雨霏亮相青岛半岛全媒体记者何毅3月17日下午,青岛体育中心新闻发布厅内,奥运冠军张雨霏出席2023年全国春季游泳锦标赛的发布会,并接受了媒体记者的访问。现场,张雨霏身着阳光朝气的运动服亮相,见为了怀上龙凤胎,网红球球打50万一针的羊胎素,父亲老赵极力反对3月16号晚上,赵本山女儿网红球球和母亲一起直播聊天!被直播间被粉丝问起已经和丈夫领证结婚快一年,没有要小孩的计划。球球很认真的回答这个问题,表示生小孩在自己计划当中,正在进行!因国乒女双克日韩包揽冠亚男双独苗险胜世界第一北京日报客户端记者王笑笑3月17日,WTT(世界乒乓球职业大联盟)新加坡大满贯结束了男女双打半决赛的争夺。中国两对女双组合分别击败劲敌,包揽冠亚军,男双独苗樊振东王楚钦也击败世界排皇马引援计划曝光2。1亿打包德甲双星,四大国脚或遭清洗(点击阅读可看更多857体育赛事资讯)皇马在欧冠18决赛两回合总比分62双杀利物浦晋级。但皇马在西甲以落后死敌巴萨9分卫冕希望渺茫。从阵容上看本泽马莫德里奇克罗斯三大元老依旧保持着如果有一天,希望我们的国足能重现2002年的荣光我们中国足球无语要说,从春晚一开始就是30多年,在举国欢腾的春晚上一阵吐槽,国足已经成了八戒笑孙猴不知自丑了!以及今天我就来罗列一下以往讽刺国足的相声小品作品,和分析一下国足到底存广东轻取广州,全场高呼易建联,多么精彩的一场德比之战!点击阅读可看更多857体育赛事资讯大家好,我是璐璐!10179,恭喜广东队客场战胜广州男篮,避免遭遇连败!赛前,上一场仅得66分广东宏远,遭到了自家球迷的口诛笔伐,甚至已经上升到了王楚钦41林高远晋级新加坡大满贯男单4强又是一场披头散发,撕心裂肺的比赛,到了半决赛就紧张了,两个国乒队员两个左手,两个帅哥,手心手背都是肉,竞技体育就是这样残酷,冠军只有一个,林高远技术没问题,心态容易出问题,但是上一喜讯!嘉定健儿在全国青年游泳锦标赛中摘得一银一铜2023年全国青年游泳锦标赛于3月12日15日在安徽合肥举行。由嘉定区输送的运动员蔡天祺代表上海队参加比赛,在男子200米50米仰泳比赛中,分别获得个人银牌和铜牌,在100米仰泳比有一说一,梅罗在这个时代独一档,但是就历史而言,真不如大罗评价一个球员,不光要看荣誉,还要看他在不同的队友不同的球队中的表现,大罗效力过的俱乐部有埃因霍温,巴塞罗那,国米,皇马,AC米兰以及巴西国家队(生涯初期和末期的巴西俱乐部未计算在内世界冠军谢杏芳走进清远分享心得暂时失败不可怕,最可怕的是放弃如今年轻人接触的社会面更广阔,选择也更多,但做好一件事,更需要足够专注。16日下午,在本届省运会羽毛球赛开幕之际,广州籍羽毛球世界冠军谢杏芳在清远体育中心与现场观众讲述冠军故事分享
范志毅女儿回国读研!却因英国国籍引争议,与大7岁土豪男友分手范志毅是我国著名足球运动员,当年帮助中国男足打进世界杯,被球迷们称为范大将军。范志毅已经退役很多年了,但他始终没有离开人们的视线,甚至比过去更加出名了。让范志毅走红的主要原因是他对继Theshy之后,Rookie也连续三年无缘世界赛,仁川3C仅剩JKL前言2022LPL夏季赛已经全部结束,最终JDG在鏖战五局之后,成功翻盘战胜TES,拿下了今年LPL夏季赛的冠军,这也是他们的第二个LPL冠军了,而在夺冠之后,JDG也锁定了LPL网曝女排世锦赛14人名单,世界冠军被弃用,蔡斌争冠大胆变阵众所周知,最近中国女排正在宁波北仑备战世锦赛,期待能够在世联赛之后取得更好的成绩。从目前来看,在世锦赛日程逐渐临近之后,很多球迷一直关注中国女排这一次的大名单到底是怎么样安排的,后黄山的世界,世界的黄山画面中,如镜般的月沼,倒映着蓝天白云和粉墙黛瓦的徽州古民居,将天地万物神奇地融合为一幅美丽的画卷,悠远而恬静这幅来自世界文化遗产地安徽省黄山市宏村的画面,从今年6月开始,出现在伦敦2022年,调整国家ampampquot法定节假日ampampquot的建议将迎来ampampquot2取消1增加ampampquot当节日到来的时候,很多人都非常开心,一方面是因为节日热闹,许久未见的人也能有理由相聚在一起,还有最重要的原因就是大部分工作和学习过节都会休息,国家也有法定节假日。有些法定节假日会和发改委实施一批具有前瞻性战略性的国家重大科技项目刘丽靓中国证券报中证网中证网讯(记者刘丽靓)9月1日,国家发改委在求是撰文指出,要加快实现科技自立自强。构建新发展格局最本质的特征是实现高水平的自立自强,加快科技自立自强是畅通国内2022中国家博会中国建博会同期在上海举行9月5日上午,由商务部消费促进司上海市商务委员会和中国对外贸易中心共同主办的2022国际消费季家居焕新消费节和第50届中国家博会(上海)2022中国建博会(上海)在国家会展中心(上明晚开播!经超又有2部新剧同时官宣,演员阵容不错,该追哪一部最近央八热播剧决胜零距离开播,时隔多年经超终于再演男主,而且还是军旅题材,着实让大家过了一把瘾,场面高燃,经超演技在线,丁海峰石兆琪等人气势不减。同时在欢乐颂3中经超还饰演了戚牧一孩子问妈妈以后我长大你会逼我结婚吗?01。妈妈你会逼我结婚吗?一个快上中学的孩子,暑假放假在家里面,和妈妈吃饭聊天,妈妈,现在很多的人不想结婚,家里面就死命的催。以后如果我长大了,到了30岁还没结婚,你会催我结婚吗?孩子们做的这些小事会伤害他们,家长们应该注意避免挖他们的鼻子童年和鼻屎似乎并存。扫描任何一个满是孩子的房间,很有可能你会看到至少有一个挖金子。更恶心?他们经常擦拭他们在最近的表面上发现的宝藏,或者吃掉它。采摘会导致流鼻血,所以和孩子自己分房睡更好最近身边总有朋友跟我吐槽,我儿子上二年级了,还是跟我们睡,一个晚上踢被子,三个人都睡的不好。那怎么不分床不分房呢?他就是不肯,说什么有鬼,一个人睡不着,房间装好了都不肯自己睡。孩子