Bootstrap

动态代理

无论是静态代理还是动态代理,究其本质,是我想调用一个接口中的方法,如果不用代理,那就是new这个接口,然后直接调用,当然了,接口是不能直接new的,还需要弄一个实现类,通过new这个实现类来调用方法。这是最直接的,也就是没有用到代理。

如果用代理呢?那就是我们通过new这个代理,然后调用这个代理类中的重写方法,就可以间接调用那个方法了,甚至还可以增添点业务型的代码。因为这个代理来为我们调用接口中的方法,所以这个代理类中必须要有那个接口作为成员变量。因为我们是多态的写法,所以传入的接口调用那个方法,就是调用子类中的方法。

一个接口,一个真实对象(真实对象就是我们要调用的这个对象里面的某个方法),这个接口其实就是真实对象的,一个代理对象。 在这里插入图片描述

真实对象

在这里插入图片描述

代理对象(代理对象要包含真实对象,其中一个成员变量就是真实对象的接口,构造方法中的参数就是这个接口)

代理对象的这个类有3个注意点: 第一点:代理对象的这个类要包含真实对象这个类,所以有一个成员变量是这个接口,成员变量的类型也就是这个接口。 第二点:构造方法需要传递一个参数,这个参数赋值给这个成员变量。 第三点:实现这个接口的代理对象类的重写方法,是通过这个成员变量来调用方法的,因为实现了多态,这个接口调用的方法其实是实现类里面重写的方法,可以在调用方法的前后添加其他的业务
在这里插入图片描述

this关键字和super关键字的用法,this可以用在本类的构造方法中,用来访问本类的另一个构造方法。但是this(…)调用也必须是构造方法的第一个语句,唯一一个,而super()也必须是第一个,所以super和this两种构造调用,不能同时使用

在这里插入图片描述在这里插入图片描述

上面显示的是静态代理,如果现在我要代理其他的真实对象,那我肯定还要实现一个接口

在这里插入图片描述

添加一个接口,就要在代理类里面添加一个成员参数和重写这个接口的方法,很繁琐,而且如果接口里面的方法参数发生了改变,那就要改很多地方了,可维护性差

在这里插入图片描述在这里插入图片描述

那该怎么办了,静态代理这么多问题,该怎么解决呢?

之前静态代理,都是来找我来代购,现在呢?现在我成立了一家代购公司,我现在成为了老板,现在有人要代购,就不会再来找我本人了,而是去我公司,我让我公司的员工们来为他们进行代购,每个员工都有自己擅长的代理区域

动态代理其实就是通过Proxy类里面的静态方法newProxyInstance来生成一个员工,让这个员工去代购,相当于静态代理里面的我,这个员工调用接口里面的方法的时候,因为newProxyInstance里面传入了一个InvocationHandler接口,所以调用方法的时候会触发InvocationHandler接口里面的Invoke方法,而这个invoke方法里面有个method 的参数,通过反射会进行调用,当然了也可以在调用这个方法的前后增加一些业务型的代码

其实主要就4点 1、动态代理要包含真实对象,其实也就是接口,这个接口是在invoke方法中调用 2、动态代理类实现InvocationHandler接口 3、通过Proxy.newProxyInstance生成员工 4、员工调用接口中的方法,实际上是调用invoke方法

在这里插入图片描述在这里插入图片描述

动态代理类里面注意点:

在这里插入图片描述

InvocationHandler 是一个接口,里面只有一个方法 invoke

在这里插入图片描述在这里插入图片描述在这里插入图片描述

;