千家信息网

Java代理模式是什么

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容介绍了"Java代理模式是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 代理模
千家信息网最后更新 2026年11月03日Java代理模式是什么

本篇内容介绍了"Java代理模式是什么"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

Java 代理模式

什么是代理

代理是一种设计模式,它的核心思想,是将对目标的访问转移到代理对象上。这样做的好处就是,目标对象在不改变代码的情况下,可以通过代理对象加一些额外的功能。这是一种编程思想,在不改变原有代码的情况下,通过代理增加一些扩展功能。

代理过程如图所示,用户访问代理对象,代理对象通过访问目标对象,来达到用户访问目标对象的目的,

代理模式包含一下三个角色:

  • ISubject:接口对象,该接口是对象和它的代理共用的接口。

  • TargetSubject:目标对象,是实现抽象主题接口的类。

  • Proxy:代理角色,内部含有对目标对象TargetSubject的引用,从而可以操作真实对象。代理对象提供与目标对象相同的接口,以便在任何时刻都能代替目标对象。同时,代理对象可以在执行目标对象操作时,附加其他的操作,相当于对真实对象进行封装。

常见的代理模式分为静态代理和动态代理,动态代理在Java中的实现分为JDK动态代理和cglib代理。

静态代理

在之前已经说过,在代理模式中有三个角色,一是目标接口,二是目标对象,三是代理对象。

现在以具体代码来实现,首先是目标接口如下:

 public interface IBlogService {    void writeBlog();}

目标对象实现了目标接口,代码如下:

public class BlogService implements IBlogService {    @Override    public void writeBlog() {        System.out.println("i'm writing...");    }}

静态代理对象,通过构造方法获取到目标对象,并实现了目标接口,在目标接口的方法里调用了目标对象的方法,代码如下:

public class BlogStaticProxy implements IBlogService{    private IBlogService blogService;    public BlogStaticProxy(IBlogService blogService) {        this.blogService = blogService;    }    @Override    public void writeBlog() {        System.out.println("start writing...");        blogService.writeBlog();        System.out.println("end writing...");    }}

测试:

public class TestStaticProxy {    public static void main(String[] args) {        IBlogService target = new BlogService();        BlogStaticProxy proxy = new BlogStaticProxy(target);        proxy.write();    }}

start writing…

i'm writing…

end writing…

静态代理,在不修改目标对象的情况下,可以通过代理对象做额外的扩展功能。但静态方法不是很灵活,如果目标接口的代码修改,目标对象和代理对象都需要修改。

动态代理在一定程度上避免这种情况,动态代理不需要代理对象实现目标接口,并且上在java 虚拟机的内存中动态的生成代理对象

Jdk动态对象

Jdk的动态代理由Proxy这个类来生成,它有三个参数:

  • ClassLoader loader,:指定当前目标对象使用类加载器,获取加载器的方法是固定的

  • Class[] interfaces,:目标对象实现的接口的类型,使用泛型方式确认类型

  • InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入

 public static Object newProxyInstance(ClassLoader loader,                                          Class[] interfaces,                                          InvocationHandler h)        throws IllegalArgumentException    {    }

Jdk的动态代理代码如下:

 public class JdkBlogProxyFactory {    private Object target;    public JdkBlogProxyFactory(Object target) {        this.target = target;    }    public Object newInstance() {        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),                (proxy, method, args) -> {                    System.out.println("start writing");                    Object o = method.invoke(target, args);                    System.out.println("end writing");                    return o;                });    }}

测试类:

public class TestJdkProxy {    public static void main(String[] args) {        IBlogService target = new BlogService();        System.out.println(target.getClass());        // 给目标对象,创建代理对象        IBlogService proxy = (IBlogService) new JdkBlogProxyFactory(target).newInstance();        // class $Proxy0   内存中动态生成的代理对象        System.out.println(proxy.getClass());        // 执行方法   【代理对象】        proxy.writeBlog();    }}

控制台打印如下:

class com.forezp.proxy.BlogServiceclass com.sun.proxy.$Proxy0start writingi'm writing...end writing

CGLib动态代理

CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。

CglibBlogFactory代理工厂类如下:

public class CglibBlogFactory implements MethodInterceptor {    private Object target;    public CglibBlogFactory(Object target) {        this.target = target;    }    //给目标对象创建一个代理对象    public Object getProxyInstance() {        //1.工具类        Enhancer en = new Enhancer();        //2.设置父类        en.setSuperclass(target.getClass());        //3.设置回调函数        en.setCallback(this);        //4.创建子类(代理对象)        return en.create();    }    @Override    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {        System.out.println("start writing...");        //执行目标对象的方法        Object returnValue = method.invoke(target, objects);        System.out.println("end writing...");        return returnValue;    }}

测试类:

public class TestCglib {    public static void main(String[] args) {        IBlogService target = new BlogService();        //代理对象        IBlogService proxy = (IBlogService) new CglibBlogFactory(target).getProxyInstance();        //执行代理对象的方法        proxy.writeBlog();    }}

运行程序,控制台打印:

start writing...i'm writing...end writing...

"Java代理模式是什么"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

对象 代理 目标 接口 方法 动态 模式 代码 情况 静态 三个 功能 子类 技术 角色 测试 生成 事件 内存 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 湖北九亚互联网络科技有限公司 湖南永感互联网科技有限公司 远信互联网科技 互联网科技革命 唐信互联网科技 大连 苏州大垚互联网科技 互联网科技美容 成都狮子座互联网科技 互联网为啥属于高科技 互联网还是高科技吗 中国航天科技大学国际工业互联网 青岛科技大学互联网大赛研究生 乌鲁木齐新华智原互联网科技学校 高科技互联网套路 产业互联网科技服务公司 互联网风格科技公司名称 上海万顺科技互联网有限公司招聘 科技信息时代互联网发展 亚光科技低轨卫星互联网 伍佰万互联网科技是干嘛的 互联网与科技 互联网科技公司简介 山东特亿宝互联网科技有限公司 西安互联网科技公司 注册互联网科技公司经营范围大全 迪庆互联网科技招生 明优互联网科技有限公司 江苏苏星互联网科技有限公司 互联网界的黑科技 承德科技产业互联网平台
0