java静态代理和动态代理的区别是什么?相关区别讲解

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问,那java静态代理和动态代理的区别是什么?下面来我们就来给大家讲解一下。

一、静态代理

静态代理是指 在jvm运行之前就已经获取到代理类的class信息。在静态代理模式下,代理类需要开发者自己写好,即开发者需要自己实现代理类的.java文件,也就是说在项目编译之前就需要存在代理类的.java文件;

然后再编译阶段就可以将代理类的.java文件编译成.class文件,从而得到代理类的class信息;

因为此时得到了代理类的class文件还没到java程序启动运行阶段呢,所以管这个叫做静态代理,也就是在程序代码还未启动之前就已经获取到代理类的class信息。

二、动态代理

动态代理是指 在java程序运行过程(程序已经启动在运行了)由jvm生成代理类的class信息,该class信息生成后是直接处于内存中的,并没有写入磁盘保存起来;

然后通过反射方式实例化代理类对象,因为代理类的class信息已经存在于内存中,所以可以通过反射方式实例化。

静态代理是需要开发人员自己实现代理类的逻辑的,且代理类的class信息是在程序运行之前就已经可以获取到的了,.java文件经过编译后可以得到.class文件;

而动态代理是不需要开发人员自己实现代理类的,也就是说使用动态代理方式的话,项目代码中是不存在代理类的.java文件的,既然代理类未由开发者实现,那么程序经过编译之后肯定也不会有代理类的.class文件。

也就是说经过编译之后程序未启动运行之前,关于代理类的信息我们一无所知,它是在程序运行过程中需要用到的时候才会由jvm动态生成的,而且生成之后也只存在于内存中,不会写到磁盘保存成.class文件,更加不会保存为.java文件;

在程序重启或者说发生了gc,这个代理类的class信息从内存中被卸载之后,关于这个代理类的信息就没有了,只有当代码再次访问到代理对象时,才又会重新生成代理类的class信息。

其实它们的区别就是在于静态代理是需要开发人员自己实现代理类的逻辑的,且代理类的class信息是在程序运行之前就已经可以获取到的了,而动态代理是不需要开发人员自己实现代理类的,最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。

推荐阅读:

java如何做到让用户下线?java应用领域有哪些?

jcreator怎么配置jdk?jcreator配置jdk教程

ReentrantLock与synchronized的区别有哪些?有相似点吗?