Java动态代理

来源:互联网 发布:ubuntu luvit 编辑:程序博客网 时间:2024/06/05 15:21

Java动态代理

最近发现很多项目都用到了动态代理,就又认真学习了下Java动态代理。代理模式应用在很多地方,但是如果在编码的时候就添加代理类,那整个代码就会变的非常冗余,繁琐。这样动态代理就应运而生了,动态代理的代理是在程序运行的时候动态生成的。动态代理只需要提供一组接口,以及被代理的对象,程序就会自动生成代理类,而且你还可以在运行方法的前后做一些自己需要的操作,甚至于不执行方法。

下面介绍一个动态代理的例子。

首先是一个被代理的类,以及类实现的接口

public interface ProxyInterface{    void doProxy();}public class ProxyObject implements ProxyInterface{    public void doProxy(){        System.out.println("hello proxy object");    }}

然后有一个对代理运行的时候调用处理的Handle类

public class TestProxyHandler implements InvotationHandler{    Object proxyObject = null;    public TestProxyHandler(Object proxyObject){        this.proxyObject = proxyObject;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{    Object result = method.invoke(proxyObject,args);}

使用这些代理的代码

ProxyObject object = new ProxyObject();TestProxyHandler proxyHandler = new TestProxyHandler(object);ProxyInterface proxyInterface = (ProxyInterface)Proxy.newProxyInstance(ProxyObject.class.getClassLoader(),                object.getClass().getInterfaces(),                proxyHandler);proxyInterface.doProxy();

通过Proxy的newProxyInstance方法产生了一个新的代理对象,这个代理对象实现了指定的接口(方法newProxyInstance第二个参数传入的内容)。程序在运行的时候会执行proxyHandler的invoke方法,我们可以在invoke方法里面做自己需要做的一些操作。

上面就是动态代理的一个非常简单的例子。一个最明显的特征就是代理对象不是单独作为一个类,而是有java代理代码自动生成,其中生成的代理对象内部又引用了InvotationHandler,由InvotationHandler连接与被代理对象。

优势

  1. Proxy的代码量是固定的了,不会变成一堆庞大的代码
  2. 可以实现AOP编程

看着动态代理似乎简单,但是应用起来非常广泛,而且有很多意想不到的巧妙。

0 0
原创粉丝点击