理解Java动态代理(1)(二)

2014-11-23 21:35:42 · 作者: · 浏览: 18
System.out.println("工作结束");
return result;
} else {
return method.invoke(target, args);
}
}
}
复制代码
是不是感觉比之前牛X多了,当然目的还是找人要账,可能是我也可能是马六:
//JDK Dynamic Proxy
DynamicLenderProxy proxy = new DynamicLenderProxy();
ILender bookProxy = (ILender) proxy.bind(new LiSiImpl());
long money = bookProxy.force("maliu");
System.out.println("要回了" + money + "块QB");
心平气和的找maliu要账。
要回了100块QB
我们通常还可以把动态代理跟注解结合起来用,“帮会”越来越大,想立稳得提供多种业务,比如暴力要账,可以让人选择用什么样的暴力,是赤手空拳还是刀墙棍棒伺候:
复制代码
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Force {
String weapon() default "拳头";
}
复制代码
有了这个注解可以在接口里使用:
复制代码
/**
* 借钱方
*
* @author moon
*
*/
public interface ILender {
/**和平方式*/
public long peace(String name);
/**暴力方式*/
@Force(weapon = "AK47")
public long force(String name);
}
复制代码
改下DynamicLenderProxy里的invoke方法:
复制代码
/**
* 调用方法
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (method.isAnnotationPresent(Force.class)) {
Force force = method.getAnnotation(Force.class);
String weapon = force.weapon();
System.out.println("用" + weapon + "开始工作");
Object result = method.invoke(target, args);
System.out.println("搞定收工");
return result;
} else {
return method.invoke(target, args);
}
}
复制代码
拿AK47找人要钱谁敢不还:
用AK47开始工作
以暴力方式找zhanjindong要账
搞定收工
要回了250块QB
(这里有个问题注解只能用在接口里,用在实现类里如何获取到呢?)
JDK动态代理的使用就是这么简单,下面就说为什么叫动态代理了。假设有一天我为实在还不了钱了,于是就想花钱找人把借钱给我的人干掉,于是我成了个凶手:
public interface IMurderer {
@Force(weapon = "沙漠之音")
public long kill(String name);
}
复制代码
public class JdzhanImpl implements IMurderer {
public void kill(String name) {
System.out.println("找我还钱?我要你" + name + "的命");
}
}
复制代码
恰好这时"JDK"拓展了业务,也干杀手这一行当了,于是乎当初找我还钱的人成了我雇的杀手,但是实现一点没动:
DynamicLenderProxy2 proxy = new DynamicLenderProxy2();
IMurderer murderer = (IMurderer) proxy.bind(new JdzhanImpl());
murderer.kill("LiSi");
用沙漠之音开始工作
找我还钱?我要你LiSi的命
搞定收工
好了,这个我胡扯的例子说完了,动态代理的好处也就体现出来了:
可以为不同的接口进行代理
如果我们用静态代理的话那么每个接口我们都得写一个代理类。