java中的動(dòng)態(tài)代理

一個(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");

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容