• 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 ++++

  • 相关阅读:
    vue
    Html5的本地储存 Web Storage
    java json解析(转)
    Python常用字符编码(转)
    特殊符号集锦(转)
    neo4j性能调优(转)
    hadoop fs -text和hadoop fs -cat的区别(转)
    docker和dockerfile极简入门(转)
    docker原理(转)
    neo4j配置(转)
  • 原文地址:https://www.cnblogs.com/atai/p/7587369.html
Copyright © 2020-2023  润新知