代理模式

# 静态代理

public class QQ {

    public static void main(String[] args) throws ParseException {
        Subject realSubject = new RealSubject();
        ProxyObj proxyObj = new ProxyObj(realSubject);
        System.out.println(proxyObj.sellBook());
        System.out.println(proxyObj.speak());
    }

}

interface Subject {
    int sellBook();

    String speak();
}

class RealSubject implements Subject {

    public int sellBook() {
        System.out.println("selling book");
        return 1;
    }

    public String speak() {
        System.out.println("qq speaking");
        return "qq";
    }

}

class ProxyObj implements Subject {

    Subject sbj;

    public ProxyObj(Subject sbj) {
        this.sbj = sbj;
    }

    public int sellBook() {
        System.out.println("do something before sell book");
        int temp = sbj.sellBook();
        System.out.println("do something after sell book");
        return temp;
    }

    public String speak() {
        return sbj.speak();
    }

}

# 动态代理 - jdk

public class QQ {

    public static void main(String[] args) throws ParseException {
        final Subject realSubject = new RealSubject();

        Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
                new Class[] { Subject.class }, new InvocationHandler() {
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("do something before invoke method");
                        Object reObj = method.invoke(realSubject, args);
                        System.out.println("do something after invoke method");
                        return reObj;
                    }
                });

//        Subject proxyObj = (Subject) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),
//                new Class[] { Subject.class }, new MyInvocationHandler(realSubject));
        System.out.println(proxyObj.sellBook());
        System.out.println(proxyObj.speak());
    }

}

interface Subject {
    int sellBook();

    String speak();
}

class RealSubject implements Subject {

    public int sellBook() {
        System.out.println("selling book");
        return 1;
    }

    public String speak() {
        System.out.println("qq speaking");
        return "qq";
    }

}

class MyInvocationHandler implements InvocationHandler {

    Object obj;

    public MyInvocationHandler(Object obj) {
        this.obj = obj;
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(obj, args);
    }

}

* 需要注意的地方

1. 如果使用匿名内部类,则被代理类需要使用final修饰

# 动态代理 - cglib

public class QQ {

    public static void main(String[] args) throws ParseException {
        RealSubjectt realSubject = (RealSubjectt) CglibProxy.getProxy(new RealSubjectt());
        System.out.println(realSubject.sellBook());
        System.out.println(realSubject.speak());
    }
}

class RealSubjectt {

    public int sellBook() {
        System.out.println("selling book");
        return 1;
    }

    public String speak() {
        System.out.println("qq speaking");
        return "qq";
    }

}

class CglibProxy implements MethodInterceptor {

    private Object target;

    public CglibProxy(Object target) {
        this.target = target;
    }

    public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
        System.out.println("do something before " + arg1.getName());
        Object result = arg1.invoke(target, arg2);
        System.out.println("do somethind after " + arg1.getName());
        return result;
    }

    public static Object getProxy(Object target) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(new CglibProxy(target));
        return enhancer.create();
    }
}
原文地址:https://www.cnblogs.com/lwmp/p/10716201.html