• jdk动态代理 和 cglib动态代理


    //结果
    enhancing
    eat

    jdk动态代理:jdk自带,被代理类实现接口,委托类(handler)实现InvocationHandler,方法增强可以写在invoke中。上代码

    package com.mmh.springbootall.test;
    
    /**
     * @Description: jdk动态代理--接口
     * @Author : myron
     * @Date : 2020-06-23 14:14
     **/
    public interface Person {
        void hello();
    }
    package com.mmh.springbootall.test;
    
    /**
     * @Description: jdk动态代理--被代理类
     * @Author : myron
    package com.mmh.springbootall.test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /**
     * @Description: jdk动态代理--委托类
     *
     * 用来做生成代理类的前置逻辑
     * 用来做方法增强:invoke方法
     *
     * @Author : myron
     * @Date : 2020-06-23 14:17
     **/
    public class CustomJdkInvocationHandler implements InvocationHandler {
        private Object target;
    
        public void setTarget(Object target){
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //方法增强
            System.out.println("i'm invocation handler before");
            Object o = method.invoke(target, args);
            //方法增强
            System.out.println("i'm invocation handler after");
            return o ;
        }
    
        public Object createProxyObject(){
            return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                                          target.getClass().getInterfaces(),this);
        }
    }
    
    
    
    
     * @Date : 2020-06-23 14:15
     **/
    public class Man implements Person{
    
        @Override
        public void hello() {
            System.out.println("hello");
        }
    }
    package com.mmh.springbootall.test;
    
    /**
     * @Description: jdk动态代理--测试类
     * @Author : myron
     * @Date : 2020-06-23 14:22
     **/
    public class JdkDynamicProxyTest {
        public static void main(String[] args){
            Person p = new Man();
            //代理委托类
            CustomJdkInvocationHandler handler
                    = new CustomJdkInvocationHandler();
            //设置被代理类
            handler.setTarget(p);
            //生成代理类
            Person proxyObject = (Person)handler.createProxyObject();
            proxyObject.hello();
    
        }
    }
    //结果
    i'm invocation handler before
    hello
    i'm invocation handler after

                         

    cglib动态代理 :jdk1.3替代产品

    package com.mmh.springbootall.test;
    
    import com.alibaba.fastjson.JSONObject;
    
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    
    /**
     * @Description: Cglib动态代理--父类
     * @Author : myron
     * @Date : 2020-06-23 14:57
     **/
    public class Animal {
        private void run() {
            System.out.println("run");
        }
    
        public void eat() {
            System.out.println("eat");
        }
    }
    package com.mmh.springbootall.test;
    
    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    /**
     * @Description: Cglib动态代理--拦截器(类似委托类)
     * <p>
     * 用来做生成代理类的前置逻辑
     * 用来做方法增强:intercept方法
     * Enhancer:生成代理类
     * 但因为采用的是继承,所以不能对final修饰的类进行代理
     * @Author : myron
     * @Date : 2020-06-23 15:38
     **/
    public class CustomCglibMethodInterceptor implements MethodInterceptor {
    
    
        /**
         * 会生成 target 的 子类(代理类)
         * @param target 被代理类
         * @return
         */
        public Object createProxy(Object target) {
            Enhancer enhancer = new Enhancer();
            enhancer.setCallback(this);
            enhancer.setSuperclass(target.getClass());
            return enhancer.create();
        }
    
    
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy proxy) throws Throwable {
            //增强
            System.out.println("enhancing");
            return proxy.invokeSuper(arg0, arg2);
        }
    }
    package com.mmh.springbootall.test;
    
    /**
     * @Description: Cglib动态代理--测试类
     * @Author : myron
     * @Date : 2020-06-23 18:18
     **/
    public class CglibDynamicProxyTest {
    
        public static void main(String[] args) {
            Animal animal = new Animal();
            CustomCglibMethodInterceptor interceptor =
                    new CustomCglibMethodInterceptor();
            Animal proxy = (Animal)interceptor.createProxy(animal);
            proxy.eat();
        }
    }
  • 相关阅读:
    Zookeeper概念学习系列之分布式事务
    序列化 反序列化 输入流 输出流
    dfs常见的配置文件中的value与description(重要)
    [转]SQL Server Reporting Services
    [转]webpack4.0.1安装问题和webpack.config.js的配置变化
    [转]Vue.js 入门教程
    [转]Webpack 入门教程
    [转]使用C#调用cmd来执行sql脚本
    [转]winform利用读取xml获取webconfig
    [转]bootstrap栅格系统的属性及使用
  • 原文地址:https://www.cnblogs.com/mmh760/p/13183778.html
Copyright © 2020-2023  润新知