一個(gè)典型的動(dòng)態(tài)代理可分為以下四個(gè)步驟:
1.創(chuàng)建抽象角色
2.創(chuàng)建真實(shí)角色
3.通過實(shí)現(xiàn)InvocationHandler接口創(chuàng)建中介類
4.通過場(chǎng)景類,動(dòng)態(tài)生成代理類
package proxy.test;
//抽象角色
public interface Icode {
void doSomething(String name);
}
package proxy.test;
//真實(shí)角色
public class JavaCode implements Icode{
private? String jname;
public JavaCode(String jname){
this.jname = jname;
}
@Override
public void doSomething(String name) {
System.out.println(jname+" implemented name "+name+" in JavaCode!");
}
}
//動(dòng)態(tài)代理類(一個(gè)位于代理類與委托類之間的中介類),需要實(shí)現(xiàn)InvocationHandler接口
public class CoderDynamicProxy implements InvocationHandler{
//被代理的實(shí)例
private? Icode code;
public CoderDynamicProxy(Icode code){
this.code = code;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理前:"+System.currentTimeMillis());
Object result = method.invoke(code, args);
System.out.println("代理后:"+System.currentTimeMillis());
return result;
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class DynamicProxyTest {
public static void main(String[] args) {
//要代理的真實(shí)的對(duì)象
Icode code = new JavaCode("張三_java");
//創(chuàng)建代理類實(shí)例
InvocationHandler hander = new CoderDynamicProxy(code);
//獲取類加載器
ClassLoader cl= Icode.class.getClassLoader();
//動(dòng)態(tài)產(chǎn)生一個(gè)代理類
Icode? proxy = (Icode) Proxy.newProxyInstance(cl,code.getClass().getInterfaces(),hander);
//通過代理類執(zhí)行Javacode具體實(shí)現(xiàn)的doSomething()方法
proxy.doSomething("update project");
}
}