Java动态代理如何实现不同类型的代理模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1239个文字,预计阅读时间需要5分钟。
Java有三种代理模式:静态代理、动态代理和Cglib代理。代理模式是一种设计模式,提供了对目标对象额外访问方式,即通过代理对象访问目标对象。例如,存在一个对象A,但需要通过代理对象访问它。
Java有三种代理模式:静态代理、动态代理和cglib代理。 代理模式是一种设计模式 , 提供了对目标对象额外的访问方式 , 即通过代理对象访问目标对象. 举个例子 , 存在一个 对象A , 但是开发人员不希望程序直接访问 对象A , 而是通过访问一个中介对象B来间接访问 对象A , 以达成访问 对象A 的目的 . 此时 , 对象A 被称为 "委托类" , 对象B 被称为 "代理类" . 根据java文件字节码的创建时间来分: 在程序运行前,已经存在代理类的字节码文件,称为“静态代理”。 在程序运行前 , 不存在代理类的字节码文件 , 这种代理模式被称为 "动态代理" , 代理类的实例对象在程序运行期间由 JVM 根据反射机制动态创建。 Java静态代理 直接引用一张图片来简单说明: 静态代理的优缺点.- 优点 可以在不改变目标类(委托类)的前提下 , 修改目标类(委托类)的功能 .
- 缺点 当接口类需要增加修改删除方式时 , 委托类和代理类都需要修改 , 不易维护 . 当需要代理多个类时 , 由于代理类要与委托类实现相同的接口 , 因此一般有两种方法 .
- 只编写一个代理类 , 每代理一个委托类就多实现一个接口 , 但这样会导致代理类过于庞大 .
- 为每个委托类都编写一个代理类 , 但这样会导致代理类数量过多.
package Proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class test { public static void main(String args[]){ //创建目标类的实例化对象 testDelegate delegate = new testDelegate(); //获取delegate的classloader ClassLoader classLoader = delegate.getClass().getClassLoader(); //获取delegate对象实现的接口 Class[] interfaces = delegate.getClass().getInterfaces(); //通过代理类testHandler传入delegate对象来创建一个调用处理器 InvocationHandler invocationHandler = new testHandlder(delegate); //创建代理对象proxy testInterface proxy = (testInterface) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler); proxy.say(); } }
本文共计1239个文字,预计阅读时间需要5分钟。
Java有三种代理模式:静态代理、动态代理和Cglib代理。代理模式是一种设计模式,提供了对目标对象额外访问方式,即通过代理对象访问目标对象。例如,存在一个对象A,但需要通过代理对象访问它。
Java有三种代理模式:静态代理、动态代理和cglib代理。 代理模式是一种设计模式 , 提供了对目标对象额外的访问方式 , 即通过代理对象访问目标对象. 举个例子 , 存在一个 对象A , 但是开发人员不希望程序直接访问 对象A , 而是通过访问一个中介对象B来间接访问 对象A , 以达成访问 对象A 的目的 . 此时 , 对象A 被称为 "委托类" , 对象B 被称为 "代理类" . 根据java文件字节码的创建时间来分: 在程序运行前,已经存在代理类的字节码文件,称为“静态代理”。 在程序运行前 , 不存在代理类的字节码文件 , 这种代理模式被称为 "动态代理" , 代理类的实例对象在程序运行期间由 JVM 根据反射机制动态创建。 Java静态代理 直接引用一张图片来简单说明: 静态代理的优缺点.- 优点 可以在不改变目标类(委托类)的前提下 , 修改目标类(委托类)的功能 .
- 缺点 当接口类需要增加修改删除方式时 , 委托类和代理类都需要修改 , 不易维护 . 当需要代理多个类时 , 由于代理类要与委托类实现相同的接口 , 因此一般有两种方法 .
- 只编写一个代理类 , 每代理一个委托类就多实现一个接口 , 但这样会导致代理类过于庞大 .
- 为每个委托类都编写一个代理类 , 但这样会导致代理类数量过多.
package Proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class test { public static void main(String args[]){ //创建目标类的实例化对象 testDelegate delegate = new testDelegate(); //获取delegate的classloader ClassLoader classLoader = delegate.getClass().getClassLoader(); //获取delegate对象实现的接口 Class[] interfaces = delegate.getClass().getInterfaces(); //通过代理类testHandler传入delegate对象来创建一个调用处理器 InvocationHandler invocationHandler = new testHandlder(delegate); //创建代理对象proxy testInterface proxy = (testInterface) Proxy.newProxyInstance(classLoader,interfaces,invocationHandler); proxy.say(); } }

