静态代理

以我下面的例子为例,代理就是助理代理老板来下发任务(具体可看注释掉的内容)

动态代理

Java提供了Proxy类和InvocationHandler接口,可以生成JDK动态代理类和动态代理对象
IBoss.java:

1
2
3
public interface IBoss {
void assign();
}

Boss.java:

1
2
3
4
5
6
7
8
9
public class Boss implements IBoss {
public Boss() {
}

@Override
public void assign() {
System.out.println("Boss assign");
}
}

BossInvocationHandler.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class BossInvocationHandler implements InvocationHandler {
IBoss boss;
public BossInvocationHandler(IBoss boss) {
this.boss = boss;
}

public BossInvocationHandler() {
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("调用了"+method.getName());
method.invoke(boss,args);
return null;
}
}

ProxyTest.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.lang.reflect.Proxy;

public class ProxyTest {
public static void main(String[] args) {
IBoss boss = new Boss();
// boss.assign();
//静态代理
// IBoss assistant = new Assistant(boss);
// assistant.assign();

//动态代理
//要代理的接口,要做的事,classloader
BossInvocationHandler bossInvocationHandler = new BossInvocationHandler(boss);
//生成动态代理对象
IBoss assistant = (IBoss) Proxy.newProxyInstance(boss.getClass().getClassLoader(), boss.getClass().getInterfaces(),bossInvocationHandler);
assistant.assign();
}
}

解析

assistant.assign();不是直接调用代理对象的assign()方法,而是被拦截后进入了BossInvocationHandler的invoke()方法,然后通过反射调用了boss的assign()方法。