• 代理模式


    # 静态代理

    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();
        }
    }
  • 相关阅读:
    前后端交互中出现的问题(五)
    前后端交互中出现的问题(四)
    前后端交互中出现的问题(三)
    生成ssh密码并且添加到git远程仓库
    快捷键
    阿里一面
    B树,B+树的插入删除操作
    乐观锁与悲观锁
    并发编程中的Callable,Future,FitureTask
    java并发包下的lock接口与syschronized关键字的区别
  • 原文地址:https://www.cnblogs.com/lwmp/p/10716201.html
Copyright © 2020-2023  润新知