其实所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。
静态代理:
要求被代理类和代理类同时实现相应的一套接口,通过代理类调用重写接口的方法,实际上调用的是原始对象的同样的方法。
通过代码感受一下静态代理:
编写一个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版权协议,转载请附上原文出处链接和本声明。