Java代理

写在最前面

距离上一次写博客不知道经过多久了,有很多原因吧,家里的事占用了一部分心情,然后就是工行的破事,没完没了,最近终于脱身来做一些自己不反感的事情了,身体上累一点也觉得不那么难受

主题:代理

代理这个词在生活中出现的频率可谓不低,上网挂代理、微商代理,其实细想想和编程中的代理是一回事,就拿微商代理来说,真正的产品供货商就是你程序中的业务实体(类、接口),那些成天发朋友圈的讨厌的人就是代理,你是客户端,客户端请求时不与服务提供商直接打交道,而是通过代理。但有一点不同的是,微商代理很讨厌,而编程中的代理很讨人喜欢。当然他们都有共同点,那就是代理可以帮你做一些额外的事情
代理模式会隐藏真实的业务主体,从而达到一种封装的效果,这也是面向对象编程的一个基本思想吧。

静态代理

首先谈一谈静态代理,静态代理是最简单的代理模式。直接上代码:

业务接口:

1
2
3
public interface IBusiness{
public void earnMoney();
}

真实业务主体,实现了业务接口:

1
2
3
4
5
public class Business implements IBusiness{
public void earnMoney(){
System.out.println("股票上涨");
}
}

代理类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class BusinessProxy implements IBusiness{
private IBusiness ib;
public BusinessProxy(IBusiness ib){
this.ib=ib;
}
public void earnMoney(){
buy();
ib.earnMoney();
sell();
}
private void buy(){
System.out.println("低价买进");
}
private void sell(){
System.out.println("高价卖出");
}
}

程序入口:

1
2
3
4
5
public static void main(String[] args){
IBusiness ib=new Business();
IBusiness ibp=new BusinessProxy(ib);
ibp.earnMoney();
}

这就实现了一个最简单的代理类,实体类只是说股票要上涨,然而你无动于是,还是赚不了钱,所以需要代理类来帮你做一些买入卖出操作,这样你才能完成这个操作。

Java动态代理

使用静态代理虽然达到了上述目的,但是必须手动创建业务类,这样其实增加了耦合度,所以Java中有了动态代理。动态代理需要引用java中的Proxy类以及InvocationHandler接口。
上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface IMasterBusiness{
public void earnMoney();
}
class MasterBusiness implements IMasterBusiness{
public void earnMoney(){
System.out.println("股票上涨");
}
}
class MasterBusinessIntercepter{
public void buy(){
System.out.println("低价买进");
}
public void sell() {
System.out.println("高价卖出");
}
}
public class MasterBusinessHander implements InvocationHandler {
//被代理的对象
private Object masterBusinee;
//拦截器
private MasterBusinessIntercepter intercepter = new MasterBusinessIntercepter();

public MasterBusinessHander(Object masterBusinee){
this.masterBusinee = masterBusinee;
}


@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;

if(method.getName().equals("earnMoney")){
intercepter.buy();
result = method.invoke(masterBusinee, args);
intercepter.sell();
}else{
result = method.invoke(masterBusinee, args);
}
return result;
}
public static void main(String[] args) throws Exception {
//创建一个调用器
MasterBusinessHander handler = new MasterBusinessHander(new MasterBusiness());
IMasterBusiness target = (IMasterBusiness)Proxy.newProxyInstance(new MasterBusiness().getClass().getClassLoader(), new MasterBusiness().getClass().getInterfaces(), handler);
target.earnMoney();
}

}

可以看出,上述动态代理将sell和buy方法剥离了出来,达到了目的,这也是Java动态代理的标准创建流程。