guava反射:Reflection.newProxy方法簡化動態代理

firefule發表於2021-09-09

原理上Google Guava的動態代理也是使用JDK的動態代理,這是做了封裝,更加簡便。另外一點是能夠很好的檢查需要代理的物件必須擁有介面。使用Class類的isInterface()來做檢查。

下面我們先比較一下jdk動態代理和guava動態代理的實現:

JDK動態代理:

Foo foo = (Foo) Proxy.newProxyInstance(       Foo.class.getClassLoader(),       new Class>[] {Foo.class},      invocationHandler);

Guava動態代理:

Foo foo = Reflection.newProxy(Foo.class, invocationHandler);

可以看出使用Guava的方式更簡潔一些,下面我們用一個具體的例子來看下:

package cn.outofmemory.guava.reflect; import com.google.common.reflect.Reflection; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /**  * Created by outofmemory.cn  on 2014/7/31.  */ public class DynamicProxyDemo {     public static void main(String[] args) {         InvocationHandler invocationHandler = new MyInvocationHandler();         // Guava Dynamic Proxy implement         IFoo foo = Reflection.newProxy(IFoo.class, invocationHandler);         foo.doSomething();         //jdk Dynamic proxy implement         IFoo jdkFoo = (IFoo) Proxy.newProxyInstance(                 IFoo.class.getClassLoader(),                 new Class>[]{IFoo.class},                 invocationHandler);         jdkFoo.doSomething();     }     public static class MyInvocationHandler implements InvocationHandler{     public Object invoke(Object proxy, Method method, Object[] args)                 throws Throwable {             System.out.println("proxy println something");             return null;         }     }     public static interface IFoo {         void doSomething();     } }

就是這樣了,非常簡單。

原文連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1834/viewspace-2805651/,如需轉載,請註明出處,否則將追究法律責任。

相關文章