當(dāng)前位置:
首頁 >
Java—动态代理
發(fā)布時(shí)間:2023/11/29
45
豆豆
動(dòng)態(tài)代理利用了JDK API,動(dòng)態(tài)地在內(nèi)存中構(gòu)建代理對(duì)象,從而實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象的代理功能。動(dòng)態(tài)代理又被稱為JDK代理或接口代理。
靜態(tài)代理與動(dòng)態(tài)代理的區(qū)別主要在:
- 靜態(tài)代理在編譯時(shí)就已經(jīng)實(shí)現(xiàn),編譯完成后代理類是一個(gè)實(shí)際的class文件
- 動(dòng)態(tài)代理是在運(yùn)行時(shí)動(dòng)態(tài)生成的,即編譯完成后沒有實(shí)際的class文件,而是在運(yùn)行時(shí)動(dòng)態(tài)生成類字節(jié)碼,并加載到JVM中
特點(diǎn):
動(dòng)態(tài)代理對(duì)象不需要實(shí)現(xiàn)接口,但是要求目標(biāo)對(duì)象必須實(shí)現(xiàn)接口,否則不能使用動(dòng)態(tài)代理。
源代碼
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy;public class EatProxy {private Object entity;public EatProxy(Object entity) {this.entity = entity;}public Object get() {return Proxy.newProxyInstance(entity.getClass().getClassLoader(), entity.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("The restaurant:Making meals for guests");Object returnValue=method.invoke(entity,args);return returnValue;}});} }public class EatReal implements IEat {@Overridepublic void get() {System.out.println("The guests:I got my meal, I can eat");} }public interface IEat {public void get(); }public class JavaDemo {public static void main(String[] args) {IEat iEat=new EatReal();IEat eatProxy=(IEat)new EatProxy(iEat).get();eatProxy.get();} }總結(jié)
- 上一篇: Java—实现 IOC 功能的简单 Sp
- 下一篇: Java—BIO模型