客户端代码
public class Client { public static void main(String[] args) { // 被代理人登场 Killer killer = new NailsKiller(); // 代理登场 Killer proxy = NailsKillerProxy.newInstance(killer); // 执行 proxy.setTarget("钉子户"); proxy.kill(); } }
钉子户杀手NailsKiller没什么变化, 只是Killer的一个简单的实现
public class NailsKiller implements Killer { private String target; @Override public void setTarget(String target) { this.target = target; System.out.println(this.target + " 已经被锁定"); } @Override public void kill() { System.out.println(this.target + " 被干掉了"); } }
再来看看Handler
public class NailsKillerInvocationHandler implements InvocationHandler { private Killer killer; public NailsKillerInvocationHandler(Killer killer) { this.killer = killer; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(this.killer, args); } }
通用的动态代理类
public class DynamicProxy<T> { @SuppressWarnings("unchecked") public static <T> T newInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) { return (T) Proxy.newProxyInstance(loader, interfaces, handler); } }
具体的钉子户杀手动态代理类
public class NailsKillerProxy extends DynamicProxy { public static <T> T newInstance(Killer killer) { ClassLoader loader = killer.getClass().getClassLoader(); Class<?>[] clazz = killer.getClass().getInterfaces(); InvocationHandler handler = new NailsKillerInvocationHandler(killer); return newInstance(loader, clazz, handler); } }
运行结果完全一样:
引用
钉子户 已经被锁定
钉子户 被干掉了
钉子户 被干掉了
唯一的问题就是怎样把AOP应用到里面去, 比如在本例中我想实现一个当“钉子户"被锁定的时候需要给被代理人发一条消息。 这个怎样弄呢??? 大牛们给点意见。。。