動態代理利用了JDK API,動態地在內存中構建代理對象,從而實現對目標對象的代理功能。動態代理又被稱為JDK代理或接口代理。
靜態代理與動態代理的區別主要在:
- 靜態代理在編譯時就已經實現,編譯完成后代理類是一個實際的class文件
- 動態代理是在運行時動態生成的,即編譯完成后沒有實際的class文件,而是在運行時動態生成類字節碼,并加載到JVM中
特點:
動態代理對象不需要實現接口,但是要求目標對象必須實現接口,否則不能使用動態代理。
源代碼
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();}
}