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();
        }
    }

     

  • 相关阅读:
    记录移动端原生开发基础样式
    windows关闭打开应用的时候的安全弹窗
    thinkPad触控板手势安装
    git修改账号密码
    ssh免密登录失效处理
    xxl-rpc remoting error(Connection refused (Connection refused)), for url : http://xxxxxx:19997/run
    utools好用插件分享
    Android Studio打包apk闪退处理
    maven下载jar包失败处理
    微信文件下载位置
  • 原文地址:https://www.cnblogs.com/whtt/p/11752979.html
Copyright © 2011-2022 走看看