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

Java动态代理实现原理以及ASM技术

  1. ProxyProxy provides static methods for creating dynamic proxy classes and instances, and it is also the superclass of all dynamic proxy classes created by those methods.
  Proxy 是Java动态代理的类的父类, 基本动态代理就是围绕着他来的
  怎么来实现一个动态代理的类呢 , 有两种方法 ,都是Proxy里的API提供的 1. 构造方法实例化
  1) 我们需要代理实现的接口 public interface EchoService {     String echo(String name); }
  2) 生成代理类
  就是下面这行代码 , 调用 java.lang.reflect.Proxy#getProxyClass  此方法便可以生成一个代理类, 获取他的类对象 .Class<?> proxyClass = Proxy.getProxyClass(Demo.class.getClassLoader(), EchoService.class);
  2) 实例化对象
  我们知道实例化对象无非是 Constructor.newInstance()   么 , 但是我们不知道我们的构造方法是啥哇, 好难哇 , Java中规定如果你实现了一个构造方法,不会帮你生成无参的构造方法, 此时我们就需要知道这个参数是啥 ,
  这里不卖关子了, 上面不是说 Proxy  是多有代理对象的父类么 ,所以他绝对继承他的构造方法哇. 此时一看, 奥原来如此,竟然是InvocationHandler   对象哇 .protected Proxy(InvocationHandler h) {     Objects.requireNonNull(h);     this.h = h; }
  3) 实例化一个 InvocationHandler   对象/**  * proxy 代理对象, 是我们生成的代理类的实例化对象,比如动态生成了`Proxy$1`类,他就是这个类的实例化对象  * method 当前调用的方法对象  * args 当前方法的参数  * @return Object 方法的返回值  */ InvocationHandler handler = new InvocationHandler() {     @Override     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {          // 1. 如果方法是继承自父类Object的方法, 我们就交给代理对象实现         if (method.getDeclaringClass() == Object.class) {             return method.invoke(this, args);         }          // 2. 如果不是呢, 我们就自己判断执行         if (method.getName().equals("echo")) {             return "Hello Proxy";         }          // 3. 如果不符合我们的意思, 我们就返回空值         return null;     } };
  4) 实例化终于到了 EchoService service = (EchoService) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);
  此时就拿到了我们的实例化对象
  测试一下 System.out.println("toString : "+service);  System.out.println("echo : "+service.echo("name"));
  输出 toString : com.java.proxy.Demo$1@682a0b20 echo : Hello Proxy2. 静态方法
  这个依赖于 java.lang.reflect.Proxy#newProxyInstance   这个方法EchoService echoService = (EchoService) Proxy.newProxyInstance(Demo.class.getClassLoader(), new Class[]{EchoService.class}, handler);
  此时就直接实现了 , 其实跟上面的原理一样 ,只不过是他封装了一个方法罢了 public static Object newProxyInstance(ClassLoader loader,                                       Class<?>[] interfaces,                                       InvocationHandler h)     throws IllegalArgumentException {     final Class<?>[] intfs = interfaces.clone();      // 这个就是获取代理类 , 为JNI接口     Class<?> cl = getProxyClass0(loader, intfs);       try {          // 获取构造方法         final Constructor<?> cons = cl.getConstructor(constructorParams);         final InvocationHandler ih = h;          // 构造方法实例化对象, 返回         return cons.newInstance(new Object[]{h});     } catch (IllegalAccessException|InstantiationException e) {        ....     }  }
  所以万变不离其宗 , 2. Proxy 原理
  其实就是生成了一个代理类 , 这个 代理类  是继承了Proxy   类 , 同时实现了我们的代理接口EchoService   , 所以很是方便 ,
  但是我们知道利用这种方式实现效率并不高 , 为什么呢 ,因为所有逻辑都是基于 InvocationHandler.invoke()  . 实现的 , 同时层层封装效率也低 .
  通过 javap -p   我们发现确实如此public final class $Proxy0 extends java.lang.reflect.Proxy {   private static java.lang.reflect.Method m1;   private static java.lang.reflect.Method m2;   private static java.lang.reflect.Method m0;   public $Proxy0(java.lang.reflect.InvocationHandler) throws ;   public final boolean equals(java.lang.Object) throws ;   public final java.lang.String toString() throws ;   public final int hashCode() throws ;   static {} throws ; }
  我找了一张比较清晰的图, 对于我们这些想学这玩意的人来说 , 其实这些都并不难的.
  3. CGLIBCGLIB  其实是基于ASM   实现的 ,ASM  框架可以直接生成一个字节码文件(类) 在运行时 , 所以他就是利用这个实现的,
  对于普通的开发者,在不了解Java字节码规范的情况下基本不可能会使用  ASM   框架, 所以CGLIB   做了个封装, 简单轻巧,
  我们来说说他的核心思想 , 基本就是基于Java的继承来实现的 , 所以我们可以对他进行拓展 , 多以代理对象不能被 final  修饰
  核心对象就是 Enhancer   ,中文意思就是增强剂 , 增强字节码, 进行完成 .public  class SampleClass {     public void test() {         System.out.println("hello world");     }      public static void main(String[] args) {          Enhancer enhancer = new Enhancer();          enhancer.setSuperclass(SampleClass.class);          enhancer.setCallback(new MethodInterceptor() {             @Override             public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {                 System.out.println("before method run...");                 Object result = proxy.invokeSuper(obj, args);                 System.out.println("after method run...");                 return result;             }         });           SampleClass sample = (SampleClass) enhancer.create();         sample.test();     } }before method run... hello world after method run...     cglib     cglib     3.2.10 

00后计算机专业学生的最优解在哪里?对于计算机专业的同学来说,每个人都有自己的最优解,由于对最优解的理解不同,往往会选择不同的发展路线。家庭出身并不应该成为自己选择的障碍,但是完全不考虑外部因素也是不现实的,并不是所在线教育小程序专业开发在线教育小程序专业团队开发在线教育小程序专业定制开发,在线教育小程序开发,在线教育小程序搭建开发,在线教育软件专业开发,在线教育软件搭建开发一线下推广成本高传统的培训机构,小型培训机构最大的问题,就是招生引终于找到索尼降噪豆的平替款,国产货真价实的TWS耳机大佬出品国内TWS市场在经过一年多的洗牌之后,相信不少人已经发现有的牌子不见了,有的牌子降价了,还有的牌子继续用更成熟更高性价比的新品坚挺着。每个TWS耳机品牌贡献的作品其实都有自己品牌的iPhone15全部搭载苹果自研芯片,3nmA175nm基带,果粉喜忧参半苹果iPhone13系列还在热卖中,关于新机的消息又来了。爆料称,苹果将大幅改变手机造型,iPhone14药丸形打孔屏。对于这种造型,大家并不陌生,安卓阵营的主流就是挖孔屏设计。近迄今为止最精致的iPhone13mini使用报告血的教训不可否认iPhone13mini是迄今为止最精致的iPhone,但是它在实用性方面已经跟不上现在智能手机的节奏了,前几天刚入手的iPhone13mini,今天就来和大家分享一下体验三百元买降噪耳机,1MORE活塞豆降噪版真无线耳机开箱评测1more万魔这个耳机品牌大家应该都比较熟悉,而他们家耳机总是给我一种只有你想不到,没有他们做不到的感觉,比方说之前推出的睡眠豆,我觉得万魔应该给产品经理加钱。数玩工场的经常会测评曝腾讯拟收购小米旗下黑鲨手机转向VR设备腾讯拟收购游戏手机公司黑鲨科技,收购后,黑鲨整体将并入任宇昕主导的腾讯集团平台与内容事业群(PCG)。报道显示,一旦交易完成,这家以游戏手机为主的硬件厂商也将在收购后迎来业务转型。华为Mate50仍然是4G手机?但这并非重点去年在手机市场上,华为的热度可以说在最近两年一直不温不火。去年的iPhone13在中国大卖,估计也让华为手机部门心痒难耐,但是因为老美修改了芯片的供应规则,导致台积电不能给华为海思荣耀畅玩8C魅族魅蓝10参数报价对比荣耀畅玩8C手机机型荣耀畅玩8C魅族魅蓝10最新价格1099元即将上市屏幕尺寸6。26英寸6。517英寸屏幕类型TFTLCDLTPS屏幕色彩1670万分辨率152072016007苹果2022年第一场活动已在筹备第三代iPhoneSE有望在3或4月发布据彭博社古尔曼称,苹果已经在筹备2022年的第一场新品发布会活动。在最新一期的PowerOn时事通讯中,古尔曼写道,根据他从消息来源听到的消息,苹果已经为2022年的首次虚拟活动做传iPhone15将首次全部搭载苹果自研芯片在芯片领域,苹果的一举一动都备受大家瞩目。就在近日,有媒体报道称,曾在苹果负责Mac系统所有架构设计信号完整性和电源完整性的首席设计师JeffWilcox宣布从苹果离职,他也是M1
体积小巧便与携带,科大讯飞翻译笔外观设计符合孩子审美学好数理化,走遍天下都不怕。相较于数理化,英语学习也是非常重要的,无论是大小考试都会考到这门功课,在未来的职场应聘中也有可能作为考核的重要指标之一。那么,作为学生又该如何更好地学好对特斯拉刹车门的最新也是最终的思考转眼,离我发上一篇关于特斯拉刹车门的文章又一周多过去了。这段时间的所见所闻,我算是给恶心坏了,特斯拉也算是刷新了我认知的下限。继续聊先继续说说数据的事,原来的计算都是基于刹车是匀减联发科助力打造差异化旗舰,天玑开放架构OV小米全球用随着5G在全球扩展,联发科作为行业翘楚,推出了天玑5G开放架构,助力终端厂商打造具备差异化体验的终端满足用户对于多维度性能的渴求。此解决方案一经推出便被一加小米vivorealme联发科天玑系列SoCAI表现备受好评高能效AI成手机终端最强Buff全面的人工智能(AI)技术正在成为各品牌手机打造差异化的关键,这也对手机厂商提出了更高的要求,同时也给芯片厂商带来新的挑战。联发科在近日展示了一系列的天玑旗舰技术,其中高能效AI颇智能化潮涨,数据驱动的工业智能体系下企业如何找到突破口?10月15日,以云上共生智领未来为主题的首届中软国际云服务大会圆满结束。深圳市联合蓝海黄金材料科技股份有限公司副总裁姚小龙(简称联合蓝海),在会上做数据驱动制造,携手打造工业互联网年轻人的第一辆智能电动车来了!九号电动车3999元起还能定制配色中奇万铎发自九号电动车发布会鹅板凳公众号ebandeng今天,小米生态链企业九号机器人在北京发布自己的最新产品九号电动车E系列。九号电动车E是一款智能电动车,看到这里相信大部人心中男子微信账号被封后在腾讯公司坠楼事件会引发哪些改变?去年年底,在深圳大学进行短期培训的时候,中间的一天晚上稍微有空,到周边转了转,恰好路过腾讯公司滨海大厦那个办公楼。据说,住在附近的,有家长为了鼓励自己费孩子好好学习说要努力学习,考参加上海音响展(HAVE)的回顾流水账效果终于满意了(下)2021年10月15日到17日,自然声参加了2021年上海音响展,三天,可把俺累坏了,痛并且快乐着,哈哈。展会开始的头一天,自己一不小心(分明是故意的)把系统调乱了,只好等朋友过来北京思柏润旗下品牌组团亮相北京国际眼镜展第三十三届中国国际眼镜业展览会于2021年10月2022在北京中国国际展览中心举办。该展览会由中国眼镜协会和中国中轻国际控股有限公司主办,香港东方国际展览有限公司协办。随着全世界疫智能健康管理先驱代表营动智能健康管理系统近日来可穿戴设备越来越盛行,人们对心脏血氧监测运动健身的关注及其相关设备的需求陡然提升,国人对于健康管理的概念也越来越熟知,健康管理行业快速发展,互联网物联网人工智能等前沿技术下的智能化设计人性化细节美诺Miele热泵干衣机搬入新家之后,第一件事就是买了一台热泵干衣机作为庆祝。想起住在阴冷潮湿的集体宿舍里,经常衣物洗了都没有地方晾干的窘迫,拥有干衣机的快乐简直太幸福了。问了很多朋友的建议,也去过朋友家