Guava
OutOfMemory.CN技术专栏-> Java-> Guava-> Guava反射-> guava反射:Reflection.newProxy方法简化动态代理

guava反射:Reflection.newProxy方法简化动态代理

介绍guava的Reflection实现动态代理,并提供了完整的示例

原理上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();
    }
}

就是这样了,非常简单。

 

© 内存溢出 OutOfMemory.CN