静态代理
静态代理:在编译期,代理类就写好了,如下图中的ZhangSanLawyer。
1、编写Speaker接口。
2、编写目标类ZhangSan,实现Speaker接口。
3、编写ZhangSan的代理类ZhangSanLawyer。
4、编写Court(法庭)类,实现ZhangSanLawyer对ZhangSan的代理。
问题:如果李四、王五也需要同样的代理,律师的重复工作较大。
动态代理
动态代理:运行期产生的代理类。
1、编写Speaker接口。
2、编写目标类ZhangSan,实现Speaker接口。
3、编写代理类LawyerProxy,可以代理任何人。
在invoke方法的参数中,proxy是生成的代理对象;method是ZhangSan类的某个具体方法;args是ZhangSan类某个方法的具体入参,在方法反射调用时使用。
4、编写Court(法庭)类,实现ZhangSanLawyer对ZhangSan的代理。
参数1: 需要代理的目标类的类加载器
参数2: 动态代理类需要实现的接口,即需要代理的目标类的所有接口
参数3: 实现了invocationHandler接口的对象
5、原理解释
通过Proxy.newProxyInstance方法
获取代理对象时,会根据第二个参数传入的接口Speaker,
实现Speaker
接口中的所有方法,而其中每个方法都是通过反射调用的第三个参数传入的LawyerProxy
中的invoke
方法,最终将生成的代理类也拥有了其中的方法。