Java动态代理

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编程

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值