举个例子:假如有一个杀手专杀男的,不杀女的。代码如下:
java
public interface Killer {
void kill(String name, String sex);
void watch(String name);
}
public class ManKiller implements Killer {
@Override
public void kill(String name, String sex) {
if (sex.equals("man")) {
System.out.println(name + "已被击杀!");
} else {
System.out.println(name + "为女性,不杀之!");
}
}
@Override
public void watch(String name) {
System.out.println(name + "已被监视!");
}
}
但是有一个老板雇佣他杀了马冬梅(女),也就是**kill("马冬梅", "women");**要执行击杀命令!要怎么实现?
可以在击杀之前,原则上把马冬梅当做男的处理,就可以执行击杀命令了!代码如下:
java
public class KillerPrinciple implements InvocationHandler {
private Object object;
public KillerPrinciple(Object object) {
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
boolean isReward = false;
String methodName = method.getName();
if(methodName.equals("kill")){
boolean isSpecailWomen = false;
for (int i = 0; i < args.length; i++) {
if(args[i].equals("马冬梅")){
isSpecailWomen = true;//马冬梅是特殊女性
}
}
if(isSpecailWomen){
for (int i = 0; i < args.length; i++) {
if(args[i].equals("women")){
args[i] = "man";//直接当做男性处理
isReward = true;
}
}
}
}
//通过java反射机制调用目标代码
method.invoke(object, args);
if(isReward){
System.out.println("老板奖励杀手5000万美金!");
}
return null;
}
}
然后把这个原则告诉这个杀手就可以完成老板交代的任务了!代码如下:
java
public static void main(String[] args) {
ManKiller manKiller = new ManKiller();
Killer principledKiller = toPrincipledKiller(manKiller);
principledKiller.kill("小明", "man");
principledKiller.kill("小红", "women");
principledKiller.watch("马冬梅");
principledKiller.kill("马冬梅", "women");
}
java
private static Killer toPrincipledKiller(ManKiller manKiller) {
ClassLoader classLoader = manKiller.getClass().getClassLoader();
Class<?>[] interfaces = manKiller.getClass().getInterfaces();
KillerPrinciple killerPrinciple = new KillerPrinciple(manKiller);
Killer proxy = (Killer) Proxy.newProxyInstance(classLoader, interfaces, killerPrinciple);
return proxy;
}
输出结果:
小明已被击杀!
小红为女性,不杀之!
马冬梅已被监视!
马冬梅已被击杀!
老板奖励杀手5000万美金!
所以,使用动态代理是为了在不改变目标对象代码的前提下,在目标代码执行前后,可以根据目标方法和参数执行相应的逻辑,以及可以过滤和改变参数的信息。