前言
为什么要学Java动态代理呢,原因是再看cc1链条的时候,ysoserial中使用的并不是TransformedMap而是LazyMap链条,ysoserial的作者使用了对象代理的方式,所以才去了解了一下Java的动态代理,首先要明白代理是什么,然后既然说到动态代理,那么就得先来了解一下静态代理做对比。下面会从代理模式,静态代理,动态代理这三块儿来了解
代理模式
代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。
举个例子,比如说张三的老婆经常家暴张三,张三去法院告他老婆要求离婚,一审由于证据不足败诉,而这个时候呢,张三花钱请来了律师来替他上诉,律师从引用法律条文和人伦道德方面来证明 打人是不对的,促使离婚的请求。
这里把张三比作一个类,然后呢想要引用律师的法律条文和人伦道德,让律师替我们完成上诉,这里的律师就是我们的实现类,实现了法律条文和人伦道德,这就是一个简单的代理模式
静态代理
这种代理方式需要代理对象和目标对象实现一样的接口。
优点:可以在不修改目标对象的前提下扩展目标对象的功能。
缺点:
冗余。由于代理对象要实现与目标对象一致的接口,会产生过多的代理类。
不易维护。一旦接口增加方法,目标对象与代理对象都要进行修改。
下面的代码就以张三的例子来完成静态代理
package org.example.cc;
public class DaiLiDemo1 {
}
interface Speaker{
public void speak();
}
class ZhangSan implements Speaker{
@Override
public void speak(){
System.out.println("老婆打人");
}
}
class ZhangSanLawyer implements Speaker{
private ZhangSan zhangSan = new ZhangSan();
@Override
public void speak(){
System.out.println