zoukankan      html  css  js  c++  java
  • 使用泛型简化动态代理

    说明##

    1. 本文适合对动态代理有最最基本了解的人,可参看AOP的底层实现-CGLIB动态代理和JDK动态代理
    2. 本文目的在于简化动态代理的调用

    maven依赖##

        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
        </dependency>
    

    类图##

    代码##

    Shape###

    public interface Shape {
        void draw();
    }
    

    Circle###

    public class Circle implements Shape{
        @Override
        public void draw() {
            System.out.println("我是一个圆~");
        }
    }
    

    Square###

    public class Square implements Shape{
        @Override
        public void draw() {
            System.out.println("我是一个四方形~");
        }
    }
    

    DynamicProxy###

    public interface DynamicProxy<T> {
        T bind();
    }
    

    JDKDynamicProxy###

    public class JDKDynamicProxy<T> implements DynamicProxy<T>, InvocationHandler {
        public JDKDynamicProxy(T t) {
            this.t = t;
        }
    
        private T t;
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("method " + method.getName() + " begin");
            method.invoke(t, args);
            System.out.println("method " + method.getName() + " end");
            return null;
        }
    
        @Override
        public T bind() {
            return (T) Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), this);
        }
    }
    

    CGLibDynamicProxy###

    public class CGLibDynamicProxy<T> implements DynamicProxy<T>, MethodInterceptor {
        private T t;
    
        public CGLibDynamicProxy(T t) {
            this.t = t;
        }
    
        public T bind() {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(t.getClass());
            enhancer.setCallback(this);
            T t = (T) enhancer.create();
            return t;
        }
    
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("method " + method.getName() + " begin");
    //        methodProxy.invokeSuper(o, objects);
            method.invoke(t,objects);
            System.out.println("method " + method.getName() + " end");
            return null;
        }
    }
    

    Demo###

    public class Demo {
        public static void main(String[] args) {
    
            Shape shape = new Circle();
            CGLibDynamicProxy<Shape> cgLibDynamicProxy = new CGLibDynamicProxy<>(shape);
            cgLibDynamicProxy.bind().draw();
    
            shape = new Square();
            JDKDynamicProxy<Shape> jdkDynamicProxy = new JDKDynamicProxy<>(shape);
            jdkDynamicProxy.bind().draw();
        }
    }
    

    运行结果##

    注意##

    cglib中使用methodProxy和method可以达到同样的效果,但是所调参数不一样,否则会报错,具体原因无意深究,会用即可。

  • 相关阅读:
    数据结构之 移位操作
    大话设计模式之外观模式
    JSP的内置对象(application)
    从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
    linux线程应用
    【网络挖掘:成就与未来方向】之网络挖掘应用程序与相关概念
    Thinking in Java之匿名内部类
    [Go] map
    [跟着hsp步步学习系统]oracle培训学习集锦全360度扫描(2)
    HDU3791:二叉搜索树
  • 原文地址:https://www.cnblogs.com/yw0219/p/7496638.html
Copyright © 2011-2022 走看看