zoukankan      html  css  js  c++  java
  • JAVA-Proxy 代理

    jdk静态代理

    interface Dao {
        void save();
    }
    class DaoImpl implements Dao {
        @Override
        public void save() {
            System.out.println("save...");
        }
    }
    class DaoProxy implements Dao{
        private Dao target;
    
        public DaoProxy(Dao target) {
            this.target = target;
        }
    
        @Override
        public void save() {
            System.out.println("before...");
            target.save();
            System.out.println("after...");
        }
    }
    
    public class StaticProxyTest {
        public static void main(String[] args) {
            DaoImpl target = new DaoImpl();
            Dao userDao = new DaoProxy(target);
            userDao.save();
        }
    }

    jdk动态代理(代理接口)

    interface Dao {
        void save();
    }
    class DaoImpl implements Dao {
        @Override
        public void save() {
            System.out.println("save...");
        }
    }
    public class DynamicProxyTest {
        public static void main(String[] args) {
            Object target = new DaoImpl();
            /**
             * loader:业务对象的类加载器
             * interfaces:业务对象实现的所有的接口,可直接指定业务类实现的接口 Class[]
             * h:InvocationHandler 对象,最终由它调用业务对象的方法
             * public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)
             */
            Dao dao = (Dao) Proxy.newProxyInstance(DaoImpl.class.getClassLoader(), new Class<?>[]{Dao.class}, new InvocationHandler() {
                /**
                 * @param proxy 代理对象
                 * @param method 代理的方法对象
                 * @param args 方法调用时参数
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    Object result = null;
                    if (method.getName().equals("save")) {
                        System.out.println("before...");
                        result = method.invoke(target, args);
                        System.out.println("after...");
                    }
                    return result;
                }
            });
            dao.save();
        }
    }

    cglib代理(代理类)

    public class Dao {
        public void select() {
            System.out.println("select()");
        }
    }
    public class DaoProxy implements MethodInterceptor {
        /**
         * @param object 要进行增强的对象
         * @param method 拦截的方法
         * @param objects 参数列表,基本数据类型需要传入其包装类型
         * @param proxy 对方法的代理,invokeSuper 方法表示对被代理对象方法的调用
         */
        @Override
        public Object intercept(Object object, Method method, Object[] objects, MethodProxy proxy) throws Throwable {
            System.out.println("Before Method Invoke");
            proxy.invokeSuper(object, objects);
            System.out.println("After Method Invoke");
    
            return object;
        }
    }
    public static void main(String[] args) {
        DaoProxy daoProxy = new DaoProxy();
    
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Dao.class);
        enhancer.setCallback(daoProxy);
    
        Dao dao = (Dao) enhancer.create();
        dao.select();
    }
  • 相关阅读:
    241. Different Ways to Add Parentheses java solutions
    89. Gray Code java solutions
    367. Valid Perfect Square java solutions
    46. Permutations java solutions
    116. Populating Next Right Pointers in Each Node java solutions
    153. Find Minimum in Rotated Sorted Array java solutions
    判断两颗树是否相同
    求二叉树叶子节点的个数
    求二叉树第k层的结点个数
    将二叉排序树转换成排序的双向链表
  • 原文地址:https://www.cnblogs.com/jhxxb/p/10520345.html
Copyright © 2011-2022 走看看