如何实现静态代理?有啥缺陷?

静态代理实现步骤:

  1. 定义一个接口及其实现类;
  2. 创建一个代理类同样实现这个接口
  3. 将目标对象注入进代理类,然后在代理类的对应方法调用目标类中的对应方法。这样的话,我们就可以通过代理类屏蔽对目标对象的访问,并且可以在目标方法执行前后做一些自己想做的事情。
  • 静态代理中,我们对目标对象的每个方法的增强都是手动完成的(后面会具体演示代码),非常不灵活(比如接口一旦新增加方法,目标对象和代理对象都要进行修改)且麻烦(需要对每个目标类都单独写一个代理类)

实现静态代理

image-20210204204629584

SmsService

1
2
3
public interface SmsService {
String send(String message);
}

SmsServiceImpl

1
2
3
4
5
6
7
8
9
public class SmsServiceImpl implements SmsService {


@Override
public String send(String message) {
System.out.println("send message: " + message);
return message;
}
}

SmsProxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SmsProxy implements SmsService {

private final SmsService smsService;

public SmsProxy(SmsService smsService) {
this.smsService = smsService;
}

@Override
public String send(String message) {
//调用方法之前,我们可以添加自己的操作
System.out.println("before method send()");
smsService.send(message);
//调用方法之后,我们可以添加自己的操作
System.out.println("after method send()");
return null;
}
}

Main(测试类)

1
2
3
4
5
6
7
8
9
public class Main {

public static void main(String[] args) {
SmsService smsService = new SmsServiceImpl();

SmsProxy proxy = new SmsProxy(smsService);
proxy.send("皮皮虾666!");
}
}

image-20210204204756639