静态代理
以我下面的例子为例,代理就是助理代理老板来下发任务(具体可看注释掉的内容)
动态代理
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();
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()方法。