zoukankan      html  css  js  c++  java
  • 代理(静态,JDK,CGLIB)

    静态代理

      步骤一:创建抽象主题(接口)

    public interface Subject {
        /**
         * 抽象主题
         */
        public void doSome();
    }

      步骤二:真实业务代码

    public class RealSubject implements Subject {
        /**
         * 真实业务代码
         */
        @Override
        public void doSome() {
            System.out.println("真实业务");
        }
    }

      步骤三:测试

    public class ProxySubject implements Subject {
    private Subject su=new RealSubject();
    @Override
    public void doSome() {
    System.out.println("前");
    su.doSome();
    System.out.println("后");
    }
    }

     JDK代理

      步骤一:创建抽象主题(接口)

    public interface Subject {
        /**
         * 抽象主题
         */
        public void doSome();
    }

      步骤二:真实业务代码

    public class RealSubject implements Subject {
        /**
         * 真实业务代码
         */
        @Override
        public void doSome() {
            System.out.println("真实业务");
        }
    }

      步骤三:测试

    public class classsubject {
        public static void main(String[] args) {
            //创建一个静态原始对象
            final Subject subject=new RealSubject();
            Subject subjectProxy=(Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() {
                /**
                 *弥明内部类
                 *
                 * @param proxy 代理对象
                 * @param method    目标代理方法
                 * @param args  目标代理方法的参数
                 * @return
                 * @throws Throwable
                 */
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("嘿嘿,我在前");
                Object invoke= method.invoke(subject,args);
                System.out.println("嘿嘿,我在后");
                return invoke;
                }
            });
            subjectProxy.doSome();
            System.out.println(subject);
            System.out.println(subjectProxy );
        }
    }

    CGLIB代理

      步骤一:代码层

    public class Cglib {
        public void Some(){
            System.out.println("代码");
        }
    }

      步骤二:测试

    public class ServiceCglib {
        public static void main(String[] args) {
            //步骤一:目标对象
            final Cglib cglib=new Cglib();
            //步骤二:生成代理
            Enhancer enhancer=new Enhancer();
            //步骤三:指定需要代理的目标对象木模板
            enhancer.setSuperclass(cglib.getClass());
            //步骤四:实现增强的处理操作
            enhancer.setCallback(new MethodInterceptor() {
                /**
                 *
                 * @param o             目标对象
                 * @param method        目标方法
                 * @param objects       目标方法的参数
                 * @param methodProxy   代理目标对象的方法
                 * @return
                 * @throws Throwable
                 */
                @Override
                public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                    System.out.println("我在前");
    
                    Object invoke = methodProxy.invoke(cglib, objects);
    
                    System.out.println("我在后");
                    return invoke;
                }
            });
            //最后一步:创建代理
            Cglib o = (Cglib)enhancer.create();
            o.Some();
        }
    }

     

  • 相关阅读:
    sql时间天数操作
    SQL死锁
    sql操作数据库结构
    sql设置时间显示格式
    sql树形结果,查询所有子类
    centos6.5 mysql 安装
    windows git 使用
    centos6.5 vsftpd的搭建
    centos 6.5 Nginx安装
    jQuery源码中的Ajax--load方法
  • 原文地址:https://www.cnblogs.com/whtt/p/11752979.html
Copyright © 2011-2022 走看看