美文网首页
动态代理浅析

动态代理浅析

作者: He_Yifeng | 来源:发表于2019-01-17 14:47 被阅读3次

动态代理:为其它对象提供一种代理以控制对这个对象的访问。
在程序运行期间,通过反射创建出来的代理类。

JDK动态代理,顾名思义是jdk为我们提供的。jdk动态代理中必须了解的一个类和一个接口:Proxy类和InvocationHandler接口:

先看InvocationHandler接口:

public interface InvocationHandler {
  public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable;
}

该接口只有一个invoke方法,有三个参数:

proxy:代理类对象
method:被代理方法
args:被代理方法的参数列表

而Proxy类我们用到的方法便是newProxyInstance方法:

public class Proxy implements java.io.Serializable {
        ... 

        public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces,
                                          InvocationHandler h)
        throws IllegalArgumentException    

        ...
}

也是有三个参数:

loader:类加载器
interfaces:代理类实现的所有接口
h:InvocationHandler接口的一个实例,此类中必须存在InvocationHandler接口实现类的引用

例如:

/**
*  Engineer:类加载器,是一个接口
*  handler:代理实例的代理程序
*/
Engineer proxy = (Engineer) Proxy.newProxyInstance(Engineer.class.getClassLoader(), new Class[]{Engineer.class}, handler);

通过Proxy的newProxyInstance方法创建出代理对象,再有代理对象的执行方法。

jdk动态代理只支持委托类和代理类实现共同的接口的方式。如果实现共同的父类的情况,不能使用jdk动态代理,可以使用cglib动态代理。


cglib动态代理:
1.定义一个被代理的目标类(cglib不需要定义接口)

public class HelloService {

    public void sayHello(){
        System.out.println("hello heyifeng");
    }
}

2.定义Proxy类,需要继承MethodInterceptor,实现intercept方法(MethodInterceptor类中只有intercept一个方法):
该代理的目的实在被代理目标类方法前后加入切面方法。

public class HelloMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("Before:"+method.getName());
        //目标类执行的方法
        Object object = methodProxy.invokeSuper(o, objects);
        System.out.println("After:"+method.getName());
        return object;
    }
}

3.Client测试:

public class Client {

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(HelloService.class);  //继承被代理类
        enhancer.setCallback(new HelloMethodInterceptor());  //设置回调
        HelloService helloService = (HelloService) enhancer.create();  //增强的目标类,生成代理对象
        helloService.sayHello();
    }
}

相关文章

  • 动态代理浅析

    动态代理:为其它对象提供一种代理以控制对这个对象的访问。在程序运行期间,通过反射创建出来的代理类。 JDK动态代理...

  • 源码角度理解JDK动态代理的实现原理

    在另一篇文章浅析AOP实现原理(2)JDK动态代理中我们了解了JDK动态代理的用法,但是光会用还不行,这篇文章我们...

  • JDK动态代理浅析

    Spring框架中有一个核心的概念,叫做AOP(面向切面编程)。而AOP的本质其实就是jdk动态代理。所以学习动态...

  • 浅析java动态代理

    是什么 首先清楚代理是什么个什么东西。 顾明思议,代理即通过其他的方式去完成一件事。 生活中上网的时候,我们可能会...

  • 浅析静态代理和动态代理

    代理模式 ** 一、概述** 代理是一种模式,提供了对目标对象的间接访问方式,即通过代理访问目标对象。如此便于在目...

  • 面试系列~动态代理实现与原理

    动态代理有JDK动态代理, CGLIB动态代理, SpringAOP动态代理 一,JDK动态代理  jdk动态代理...

  • Java的动态代理-浅析

    什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。 什么是动态代理? Java的j...

  • 编程常用的设计模式

    动态代理和静态代理 静态代理 动态代理 静态代理与动态代理的区别 JDK中的动态代理和CGLIB 实现动态代理的方...

  • Spring的AOP原理分析

    一 动态代理 动态代理分为JDK动态代理和CGLIB动态代理 jdk动态代理 被代理类(目标类)和代理类必须实现同...

  • 设计模式之代理模式

    代理分为静态代理和动态代理。 动态代理又包括基于JDK的动态代理、基于CGlib 的动态代理、基于Aspectj实...

网友评论

      本文标题:动态代理浅析

      本文链接:https://www.haomeiwen.com/subject/mhwbdqtx.html