脚本宝典收集整理的这篇文章主要介绍了

动态代理-Proxy

脚本宝典小编觉得挺不错的,现在分享给大家,也给大家做个参考,希望能帮助你少写一行代码,多一份安全和惬意。

主要目的是记录java动态代理的实现,为rpc的学习做铺垫。

什么是动态代理?
动态代理就是在java运行时为某个类生成代理,即在code阶段,没有实际的java文件与其对应。

java实现动态代理的类就是反射包中的Proxy类。
话不多说,直接看动态代理的例子:

public class TestProxy {     public static void main(String[] args) {         PaoTui paoTuiProxy = (PaoTui)Proxy.newProxyInstance(                 PaoTui.class.getClassLoader(),                  new Class[]{PaoTui.class},                 new InvocationHandler() {                     Flan flan = new Flan();                     @Override                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                         return method.invoke(flan, args);                     }}                 );          paoTuiProxy.buySomething("an apple");         System.out.println(paoTuiProxy.toString());     } }  interface PaoTui {     void buySomething(String something); }  class Flan implements PaoTui {     @Override     public void buySomething(String something) {         System.out.println("Flan buys "+something+" for Remi");     } }

将该代理类保存下来,查看源码:

import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.lang.reflect.UndeclaredThrowableException;  public final class $Proxy0 extends Proxy implements PaoTui {     private static Method m1;     private static Method m2;     private static Method m3;     private static Method m0;      public $Proxy0(InvocationHandler var1) throws  {         super(var1);     }      public final boolean equals(Object var1) throws  {         try {             return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();         } catch (RuntimeException | Error var3) {             throw var3;         } catch (Throwable var4) {             throw new UndeclaredThrowableException(var4);         }     }      public final String toString() throws  {         try {             return (String)super.h.invoke(this, m2, (Object[])null);         } catch (RuntimeException | Error var2) {             throw var2;         } catch (Throwable var3) {             throw new UndeclaredThrowableException(var3);         }     }      public final void buySomething(String var1) throws  {         try {             super.h.invoke(this, m3, new Object[]{var1});         } catch (RuntimeException | Error var3) {             throw var3;         } catch (Throwable var4) {             throw new UndeclaredThrowableException(var4);         }     }      public final int hashCode() throws  {         try {             return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();         } catch (RuntimeException | Error var2) {             throw var2;         } catch (Throwable var3) {             throw new UndeclaredThrowableException(var3);         }     }      static {         try {             m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});             m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);             m3 = Class.forName("PaoTui").getMethod("buySomething", new Class[]{Class.forName("java.lang.String")});             m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);         } catch (NoSuchMethodException var2) {             throw new NoSuchMethodError(var2.getMessage());         } catch (ClassNotFoundException var3) {             throw new NoClassDefFoundError(var3.getMessage());         }     } }

总结

以上是脚本宝典为你收集整理的

动态代理-Proxy

全部内容,希望文章能够帮你解决

动态代理-Proxy

所遇到的程序开发问题,欢迎加入QQ群277859234一起讨论学习。如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典网站推荐给程序员好友。 本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。

80%的人都看过