动态代理、以及代理类的创建明细

在上一个项目中,我们需要使用反射去访问mapper接口中的方法以及参数,调用接口中的方法以及参数需要用到类的实例,但是我们都知接口是不能够被直接实例化的(等下我们将会提及为何接口为何不能实例化),所以我们使用到了jdk里面的动态代理;
1、那么,什么是动态代理呢?
通俗来讲,JDK提供的动态创建接口对象的方式就叫动态代理;而动态代理又是通过Proxy类创建代理对象的,然后又把接口方法”代理“给InvaocationHandler接口完成的;
2、Proxy类里的newProxyInstance()需要用到三个参数:分别是ClassLoader,一般来说就是接口类的ClassLoader;需要实现的接口数组(new class[]{接口}),至少传入一个接口进去;最后是用来处理接口方法、并且实现了InvocationHandler接口的实例(也就是代理类的构造方法)
3、我们再回过头来讲接口为何不能被实例化?
首先我们需要了解的是实例化的实际意义是在jvm的堆中开辟出一块内存空间,比如 Person p=new Person(),此处声明Person对象p,并且实例化一个Person对象,实际上是在堆中开辟出一个内存空间来存放Person对象,p则指向这块内存空间;这个地址中所存放的一些值就是我们person的一些属性(也就是我们的成员变量);而我们java的内存空间中只存放四种类型:栈、堆、代码、静态数据;我们接口中所有需要存储的具体值都可以存放在代码区和静态数据区,所以接口地址上并没有任何实际的值需要存储;所以我们给其实例化没有任何意义,只会占用代码空间;

发布了26 篇原创文章 · 获赞 9 · 访问量 763

猜你喜欢

转载自blog.csdn.net/z19950712/article/details/103835616