动态代理也就是JVM给我们提供的动态的接口,我们的代理类不需要去实现凌驾于被委托者的接口。
还是拿小刚替小明写作业为例。
首先定义写作业者的接口
interface Homeworker {
//语文作业
void chinese();
//数学作业
void math();
//英语作业
void english();
}
下来土豪朋友实现了这个接口(必须是接口)
public class Wealthy implements Homeworker {
private String hName = "";
public Wealthy(String hName) {
this.hName = hName;
}
public void chinese() {
System.out.println(hName + "写完了语文作业");
}
public void math() {
System.out.println(hName + "写完了数学作业");
}
public void english() {
System.out.println(hName + "写完了英语作业");
}
}
自定义的被委托类实现了InvocationHandler接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class WealthyIH implements InvocationHandler {
//被代理者
Class cls = null;
//被代理的实例
Object obj = null;
//我要代理谁
public WealthyIH(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(this.obj,args);
String mName = method.getName();
System.out.println("哥们我替你写完"+mName+"作业了");
return result;
}
}
最后看看场景
public class Client {
public static void main(String[] args) {
Wealthy wealthy = new Wealthy("小明");
InvocationHandler handler = new WealthyIH(wealthy);
ClassLoader cl = wealthy.getClass().getClassLoader();
Homeworker proxy = (Homeworker) Proxy.newProxyInstance(cl,new Class[]{Homeworker.class},handler);
proxy.chinese();
proxy.math();
proxy.english();
}
}
土豪类甚至不知道有个能帮他写作业的,而写作业的不光能写作业还能完成其他的委托。这就大大降低了委托类与被委托类的耦合。直到Client时才进行耦合,被委托方就好像切进来一样所以又称之为面向横切面编程(AOP)