Java-静态代理和动态代理

大家比较熟悉了Java中的代理模式。而代理模式可以分为静态代理和动态代理,下面我们通过Demo来具体分析下静态代理和动态代理。
我们先实现一个计算器接口类和实现类,具体代码如下:
计算器接口类

public interface Calculator {

    public int add(int x,int y);
}

实现类

public class CalculatorImpl implements Calculator {

    @Override
    public int add(int x, int y) {

        return x+y;
    }

}

静态代理

下面我们先通过静态代理模式来实现:

public class StaticProxy {

    private Calculator cal;
    public StaticProxy(Calculator cal){
        this.cal = cal;
    }

    public int add(int x,int y){
        int result = cal.add(x, y);
        return result;

    }
}

以上代码,我们通过在StaticProxy 中调用真正实现add方法得实现类来完成加法,这种方式直观方便,但是若是我们有很多类需要实现代理,那么我们就得一个类一个代理方法,以上这种方式显然不是最佳选择。这时,我们可以通过动态代理得方法,来很好的解决这一问题。

动态代理

我们先编写Loghandler类实现InvocationHandler接口

public class Loghandler implements InvocationHandler {
    Object obj;
    Loghandler(Object obj){
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        doBefore();
        Object o = method.invoke(obj, args);
        doAfter();
        return o;
    }

    public void doBefore(){
        System.out.println("Invoke before.......");
    }
    public void doAfter(){
        System.out.println("Invoke after........");
    }

}

调用Loghandler

Calculator cal = new CalculatorImpl();
Loghandler lh = new Loghandler(cal);

Calculator proxy = (Calculator)Proxy.newProxyInstance(cal.getClass().getClassLoader(), 
                                                                cal.getClass().getInterfaces(), lh);
System.out.println(proxy.add(1, 3));

通过Proxy.newProxyInstance来创建代理得方法可以为不同的委托类创建代理类,同样的代理我们只需要实现一遍,就可以为多个委托类创建代理类了。

猜你喜欢

转载自blog.csdn.net/u012343297/article/details/79786336
今日推荐