JDK的动态代理与cglib动态代理

JDK的动态代理与cglib动态代理

两种代理模式:java

  • 动态代理:代理类不存在,在程序运行过程当中,动态生成代理类和代理类对象,再经过代理对象调用目标对象
  • 静态代理(装饰者模式):代理类是提早建立好的,直接建立代理类对象,再经过代理对象调用目标对象

1、JDK动态代理

jdk的动态代理是基于接口的动态代理,要求目标对象必须实现至少一个接口,核心API是java.lang.reflect.Proxy类的newProxyInstance方法。数组

Object proxy = Proxy.newProxyInstance(
                    ClassLoader loader,
                    Class[] interfaces,
                    InvocationHandler handler
                );

返回值:接口的实现类对象ide

参数:代理

  • loader:类加载器对象code

  • interfaces:代理对象要实现的接口字节码对象数组,一般写成目标对象.getClass().getInterfaces()对象

  • handler:代理类的方法里,要执行的操做接口

    • 一般是加强目标对象的方法或控制目标对象的方法get

    • 是InvocationHandler接口的实现类,一般写成匿名内部类形式io

      new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
              //proxy:代理对象的引用,一般不用
              //method:调用的方法对象
              //args:调用的方法的参数
              //result:调用代理对象时的返回值
              return result;
            }
      }

2、cglib动态代理

cglib的动态代理是基于子类的动态代理,不须要目标对象实现接口,要求被代理类不能由final修饰.核心API是cglib.proxy.Enhancer类的create方法class

Enhancer.create(目标对象.getClass(), new MethodInterceptor() {
            /**
             * @param proxy:代理对象引用
             * @param method:目标对象方法(经过它能够访问目标对象)
             * @param args:传递给目标对象的参数
             * @MethodProxy methodProxy:代理对象的方法
             * @return 返回值
             * @throws Throwable
             */
   public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //功能代码
                return result;
            }
        });

返回值:目标类的子类对象

参数:

  • Class:被代理对象的字节码对象,能够建立被代理对象的子类,还能够获取被代理对象的类加载器
  • Callback:加强的代码,一般都是些一个接口的实现类或匿名内部类,咱们在使用时通常都是使用Callback接口的子接口:MethodInterceptor
相关文章
相关标签/搜索