banner
NEWS LETTER

Hook机制之动态代理

Scroll down

java的动态代理

动态代理,解析interface中的所有方法,新建一个(包名+$Proxy)的class
实例化了Proxy对象,porxy里面的InvocationHandler
每次调用方法其实执行的是InvocationHandler里面的invoke

创建IBank接口

1
2
3
4
5
6
7
public interface IBank {
/**
* 所有接口方法都会在动态代理的时候解析到
*/
void bindCard();
void loseCard();
}

创建Man实现IBank接口

1
2
3
4
5
6
7
8
9
10
11
12
public class Man implements IBank{
@Override
public void bindCard() {
System.out.println("办卡");
}

@Override
public void loseCard() {
System.out.println("挂失");
}
}

创建SalesMan实现IBank接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class SalesMan implements IBank {
private final IBank man;

public SalesMan(IBank man) {
this.man = man;
}
@Override
public void bindCard() {
System.out.println("先搞完一些流程");
//调用方法
man.bindCard();
System.out.println("办理完毕");
}

@Override
public void loseCard() {
System.out.println("先搞完一些流程");
//调用方法
man.loseCard();
System.out.println("办理完毕");
}
}

正常代理使用的时候

1
2
3
4
5
6
7
8
9
public class Main {
//如果有修改,或者接口增加了方法,都需要更改SaleMan
public static void main(String[] args) {
Man man = new Man();
SalesMan salesMan = new SalesMan(man);
salesMan.bindCard();
salesMan.loseCard();
}
}

如果使用动态代理的话

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
public class DynamicClient {
public static void main(String[] args) {
Man man = new Man();
//获取代理 动态代理其实是代理了所有的方法,而且会走BankInvocationHandler里面的invoke方法
IBank proxy = (IBank) Proxy.newProxyInstance(IBank.class.getClassLoader(),
//接口数组
new Class<?>[]{IBank.class},
//回调
new BankInvocationHandler(man));
//动态代理,解析interface中的所有方法,新建一个(包名+$Proxy)的class
//实例化了Proxy对象,porxy里面的InvocationHandler
//每次调用方法其实执行的是InvocationHandler里面的invoke
proxy.bindCard();
proxy.loseCard();
}

private static class BankInvocationHandler implements InvocationHandler {
private final IBank man;

public BankInvocationHandler(Man man) {
this.man = man;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//方法回调,方法执行还是Man
System.out.println("先搞完一些流程");
System.out.println("方法执行:" + method.getName());
Object obj = method.invoke(man,args);
System.out.println("办理完毕");
return obj;
}
}
}

其他文章
目录导航 置顶
  1. 1. java的动态代理
  2. 2. 创建IBank接口
  3. 3. 创建Man实现IBank接口
  4. 4. 创建SalesMan实现IBank接口
  5. 5. 正常代理使用的时候
  6. 6. 如果使用动态代理的话
请输入关键词进行搜索