静态代理与动态代理的区别

其实所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。

静态代理:

 要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。

通过代码感受一下静态代理:

编写一个Animal接口

再写一个Cat实现Aninal接口

 

写一个Cat的代理类ProxyCat并且实现接口Aninal 

运行

从运行结果可以看出,执行的是被代理类的对象 

从这里我们会想,如果我想再创建一个Dog对象,又需要重新为Dog创建一个代理对象,如下:

根据上述代码的演示,不难发现,静态代理的话,我们要想代理某个类,需要手动创建出一个代理类,并且共同实现一个接口,这就出现了冗余繁琐了,这其实就是静态代理的一个缺点了。 

动态代理:

和上述例子差不多,也写一个Animal接口,再写Dog类和Cat类实现Animal接口。不同的是编写一个共同的动态代理类,来代理这些类。

相比于静态代理,动态代理只需要创建一个动态代理类即可,不需要像静态代理一样为每个类手动去创建 一个代理类这种情况。动态代理只需要实现一个InvocationHandler接口,并且实现里面的ivoke()方法即可。

总结:

静态代理:

        实现条件:代理类和被代理类要有共同的父类或者接口,代理类要持有被代理类的对象引用,进行有参构造。

动态代理

        实现步骤:        

  • 新建一个接口
  • 创建代理类,实现java.lang.reflect.InvocationHandler接口
  • 重写ivoke()方法,进行加强
  • 接口测试
 Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h);
  • loader: 用哪个类加载器去加载代理对象
  • interfaces:动态代理类需要实现的接口
  • h:动态代理方法在执行时,会调用h里面的invoke方法去执行


版权声明:本文为m0_47087039原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。