Java 代理模式

打印 上一主题 下一主题

主题 829|帖子 829|积分 2487

代理模式

目标类和代理类,不是直接调用目标类对象,而是通过调用代理类的对象的方法,代理类来帮我们访问目标类对象,这样我们就可以在代理类上添加更多需要的扩展功能,而目标类不用改动,只用实现自身的主要功能。
代理类是为了扩展目标类的功能,代理类和目标类的产出结果应该相同,所以为了确保代理类和目标类的返回类型一致,最好使用接口来约束代理类和目标类。
使用接口而不是继承,也减少了目标类和代理类间的耦合,并且在动态代理中,动态生成的代理类会自动去继承 Proxy 类,而Java是单继承所以不行,而且需要使用反射来获取目标类的接口来创建代理类实例, 如果被代理对象没有实现接口,则无法通过接口来定义代理对象需要实现的方法
动态代理

在Java中可以通过Proxy.newProxyInstance()方法创建动态代理类的实例。
而与静态代理不同的是,静态是在程序运行前就已经存在代理类的字节码文件,也就是说,事先就写好了代理类的源码并编译,动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成。并且目标对象是固定的,代理类一般会持有一个目标类的对象引用(即作为成员变量。
在运行期间动态创建实例
动态代理,通俗点说就是:无需声明式的创建java代理类,而是在运行过程中生成"虚拟"的代理类,被ClassLoader加载。从而避免了静态代理那样需要声明大量的代理类。
  1. public static Object newProxyInstance(ClassLoader loader,
  2.                                           Class<?>[] interfaces,
  3.                                           InvocationHandler h)
  4.         throws IllegalArgumentException
  5.     {...}
复制代码
ClassLoader loader:用于指定一个类加载器,用来加载代理类,通常使用当前类的类加载器
Class[] interfaces:目标类的接口列表,指定生成的代理长什么样子,也就是有哪些方法
InvocationHandler h:InvocationHandler是一个接口,所以可以使用匿名内部类并重写对应方法invoke(),用来指定生成的代理对象要干什么事情,在调用代理类的方法时会自动调用该方法。
java动态代理中的invoke方法是如何被自动调用的

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表