• JDK动态代理实例


    最近看《深入浅出MyBatis技术原理与实战》这本书时,里面讲到Mapper接口的内部实现是通过JDK动态代理生成实现类,联想到之前看《SPRING技术内幕》这本书里也常常提到JDK动态代理,之前自己也转载过动态代理的文章,但一直印象不深,这次就亲自动手写个动态代理的实例。

    1.目标类接口

    这个可以说是JDK动态代理的一个缺陷,就是目标类必须要实现一个接口类,才能实现动态代理,对于没有接口实现的目标类,可以通过cglib来实现动态代理。

    public interface HelloService {
    
        void sayHello();
    }

    2.目标类的实现

    public class HelloServiceImpl implements HelloService {
    
        public void sayHello() {
            System.out.println("hello world");
        }
    }

    实现类中只有一个sayHello方法,方法内打印一句"hello world",简单。

    3.生成代理类的实现(JDK动态代理技术

    public class DynamicProxyFactory implements InvocationHandler {
    
        /**
         * 目标对象
         */
        public Object target;
    
        /**
         * 生成代理类
         */
        public Object createProxyInstance(Object target) {
            // 目标对象赋值
            this.target = target;
            // 生成代理对象
            return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),
                    this);
        }
        /**
         * 代理类中方法拦截
         */
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 目标方法调用前
            System.out.println("++++ before invoke ++++");
            // 目标方法调用
            Object result = method.invoke(target, args);
            // 目标方法调用后
            System.out.println("++++ after invoke ++++");
            return result;
        }
    }

    3.测试

    public class Test {
    
        public static void main(String[] args) {
            DynamicProxyFactory serviceProxy = new DynamicProxyFactory();
            HelloService helloService = (HelloService) serviceProxy.createProxyInstance(new HelloServiceImpl());
    
            helloService.sayHello();
        }
    }

    以下是执行测试类的输出结果:

    ++++ before invoke ++++
    hello world
    ++++ after invoke ++++

  • 相关阅读:
    面试题:最小的K个数
    面试题:反转链表
    面试题:二进制中1的个数
    数据结构之二叉树
    Serializable-源码分析
    归并、希尔、快速排序
    栈与队列
    简单排序(冒泡、选择、插入)
    Shiro 框架认证和授权
    mybatis select查询使用返回结果为resultMap
  • 原文地址:https://www.cnblogs.com/atai/p/7587369.html
Copyright © 2020-2023  润新知