靜態代理與動態代理

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class StaticAndDynamicProxy {

    public static void main(String args[]) {
        System.out.println("The static proxy");
        ICalculator iCalculator = new CalculatorProxy(new CalculatorImpl());
        int result = iCalculator.add(2, 5);
        System.out.println("In the main() " + result);
        System.out.println(iCalculator.minus(10, 2));

        System.out.println("The dynamic proxy");
        ICalculator calculator = new CalculatorImpl();
        LogHandler lh = new LogHandler(calculator);
        ICalculator proxy = (ICalculator) Proxy.newProxyInstance(calculator.getClass().getClassLoader(),
                calculator.getClass().getInterfaces(), lh);
        int r = proxy.add(3, 6);
        System.out.println("In the main() " + r);
        System.out.println(proxy.minus(100, 30));
    }
}

interface ICalculator {
    int add(int a, int b);
    int minus(int a, int b);
}

class CalculatorImpl implements ICalculator{
    public int add(int a, int b) {
        return a + b;
    }
    public int minus(int a, int b) {
        return a - b;
    }
}

class CalculatorProxy implements ICalculator {
    private CalculatorImpl calculatorImpl;
    public CalculatorProxy(CalculatorImpl cImpl) {
        this.calculatorImpl = cImpl;
    }
    public int add(int a, int b) {
        this.doBefore();
        int result = calculatorImpl.add(a, b);
        System.out.println("In the Proxy " + result);
        this.doAfter();
        return result;
    }
    public int minus(int a, int b) {
        this.doBefore();
        int result = calculatorImpl.minus(a, b);
        System.out.println("In the Proxy " + result);
        this.doAfter();
        return result;
    }
    public void doBefore() {
        System.out.println("Do Before");
    }
    public void doAfter() {
        System.out.println("Do After");
    }
}

class LogHandler implements InvocationHandler {
    Object object;
    public LogHandler(Object o) {
        this.object = o;
    }
    public Object invoke(Object obj1, Method method, Object[] args) {
        this.doBefore();
        Object o = null;
        try {
            o = method.invoke(object, args);
            System.out.println(o);
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.doAfter();
        return o;
    }
    public void doBefore() {
        System.out.println("Do Before");
    }
    public void doAfter() {
        System.out.println("Do After");
    }
}

發佈了13 篇原創文章 · 獲贊 8 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章