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

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 

厦蓄电站上水库大坝全线封顶文王颖图陈博4月20日,厦门抽水蓄能电站项目上水库主坝全线封顶,比合同节点目标提前10天,为提前进入沉降期保障10月混凝土面板施工顺利开展奠定了基础。厦蓄电站项目的上水库下水库两部我们的歌3第三季勤深深回归,期待其他嘉宾怎么样的组合呢?(我们的歌)从当初第一季,我就在追了,勤深深一直都是我最喜欢的组合,没有之一,每次合唱都能给我一种新鲜的感觉。据说(我们的歌)3除了周深以外,在爆录制嘉宾,原来之前是说张韶涵,而根龙蜥操作系统将捐赠开放原子开源基金会11月4日,龙蜥社区宣布,由阿里云统信软件等14家单位联合开源的龙蜥操作系统将捐赠到开放原子开源基金会,当前已全票通过项目孵化评审中的技术达标评审,即将进行法务合规性审核。龙蜥操作中兴发布旗舰路由器AX5400Pro,采用自研十二核双引擎主芯片11月1日,中兴通讯发布旗舰级WiFi6路由器AX5400Pro,已同步在京东中兴商城等平台开启预约,发布价599元,11月1日11月6日,参与预约立减50元,到手仅需549元。该芯盾斩获网络安全优秀创新成果奖10月11日,一年一度的全民关注网络安全顶级盛会国家网络安全宣传周在古城西安盛大开启,中央宣传部副部长,中央网信办主任国家网信办主任庄荣文,陕西省委书记省人大常委会主任刘国中在开幕2021年度中国计算机行业发展成就奖揭晓,七六所荣获两项大奖2021年9月28日,由中国计算机行业协会主办的2021中国计算机创新大会暨中国计算机行业发展成就奖颁奖典礼在北京隆重举行。工业和信息化部电子信息司副巡视员侯建仁中国计算机行业协会更小身材更大能量盛能杰发布全新单相单路逆变器近日,中国深圳讯今日,深圳市盛能杰科技有限公司正式推出全新一代单相光伏逆变器SE210KW。新机型延续了盛能杰品牌一贯的流畅线条和颜色,也继承了品牌优秀的技术性能DNA,安全可靠,电脑上好用但冷门的软件随着互联网技术的发展,越来越多的人在电脑上办公,这样的话,知道几个好用的软件就显得尤为重要。毕竟,有个好的软件可以让你在平时工作当中事半功倍,提升你的工作效率。现在就让我来告诉各位电脑上比较好的软件有哪些?随着时代的进步和互联网技术的发展,现在越来越多的人在电脑上完成一天的工作。所以知道几个好用的软件就显得十分重要。好用的软件可以让我们比别人更快地完成一天的工作,现在告诉几个我平时在电脑上的必备软件随着时代的进步,互联网的发展,计算机逐渐普及到了我们的生活当中,现在许多人都在电脑上完成一天的工作,所以知道几个好用的软件就显得很重要,可以让你在平时工作中事半功倍。这次给各位说一多屏互联助你效率翻倍,华为MateBook13s14s笔记本电脑火热来袭互联网时代,无论是日常交流沟通抑或是在线办公都非常方便。特别是对于上班族以及学生群体来说,拥有一部性能强大的笔记本电脑,意味着可以随时随地学习办公。全新的华为MateBook13s
陈一丹锲而不舍静水流深推动公益数字化来源读特社会的热点是公益的起点而公益的痛点将是社会进步的起点。这句掷地有声的观点来自腾讯主要创始人腾讯公益慈善基金会发起人兼荣誉理事长陈一丹。5月20日,他在2021年中国互联网公2500到3000元手机横屏推荐手机是我们生活中不可分割的一部分,甚至没有了手机会让你寸步难行!那么选一台称心如意的手机就显得非常重要,不过现在手机市场竞争非常激烈那么该如何选择成为了一个难题!面对琳琅满目的手机2000元价位唯一配备NFC和X轴线性马达的手机,卢伟冰喊话友商跟进2000元价位段唯一配备NFC手机从RedmiNote8Pro开始到Note10Pro,RedmiNote系列在2000元价位段唯一一个连续三代搭载NFC的手机序列。可以说RedmP2P一直在债转上下套路主要有两个原因?当P2P平台被查后,纷纷出台了相应的兑现方案,这就意味着出借人能够尽快摆脱平台回归到正常的生活,但令人没有想到的是兑现方案引起争议,除去商品兑现以及三年等待期的兑现,债转方案是最惹电子厂普工薪资PK捷普VS富士康随着电子产业的发展,电子厂也越来越多。我们所熟知的,有富士康捷普立讯精密蓝思科技等等。而进电子厂打工,就绕不开薪资这个话题。我呢,10年进的电子厂,到今天已经快11年了。在富士康做中美打响科技战,美国将在五年内投资1000亿,拜登绝不能再输中美两国在特朗普时期就处于激烈的竞争和对抗状态,美国前任总统特朗普为了打压中国,采取了很多颇为极端的做法,包括发动贸易战和科技战,污蔑华为技术涉嫌偷窃国家信息安全,指使加拿大对华为以前的电表需要抄表,现在的智能电表又是怎么远程控制的?随着科学技术的发展,在中国约960万平方千米的陆地上实现了挨家挨户的手工抄电表到不需要人力抄表的智能电网时代飞速跨越。以前,每个月我们都能看到肩膀扛着加长杆的放大镜或楼梯手里拿着一人民币数字化即将到来,数字人民币为人们带来便利数字人民币子钱包再度扩容,国内首批互联网银行之一的网商银行(支付宝)成为第七家参与公测试点的商业银行。5月8日,数字人民币App更新,钱包运营机构中的网商银行(支付宝)已呈现可用状CEO们率先卷不动了王慧文看了看黄峥,又看了看张一鸣。再看看王兴停更的饭否,猛然间一拍大腿退早了!01hr同样是80后,同样是千亿美元市值的科技公司,同样是创始人急流勇退,同样是传位给一直在一起创业的小米新专利,将手机变乐高?回应为了环保根据网上流传的一则消息我们得知,小米现在正在考虑着手开发一款模块化的智能手机。而为了能够让用户完全理解这一设计,荷兰图像设计师基于这项专利绘制出了一幅产品渲染图,接下来就让我们一起电摩的崛起?2021还有这5款新电摩即将发布对于电动摩托车市场,摩托车品牌们一直都虎视眈眈。但或许是因为电动两轮发展的阶段性限制,早前的它们对于这一领域大多处于观望状态。眼看电摩市场发展趋势逐渐向好,自去年开始,部分摩托车品