0、JDK 動態代理的條件是被代理對象必須實現接口。java
Spring AOP不須要開發人員本身維護代理類,其已幫開發人員生成了代理類。Spring AOP的實現是經過在程序運行時,根據具體的類對象和方法等信息動態地生成了一個代理類的class文件的字節碼,再經過ClassLoader將代理類加載到內存總,最後經過生成的代理對象進行程序的方法調用。ide
一、接口測試
public interface Animal { void eat(); }
二、接口實現this
public class Dog implements Animal { @Override public void eat() { System.out.println("Dog須要吃骨頭"); } }
三、動態代理類,實現 InvocationHandler 接口代理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 動態代理類 */ public class AnimalInvocationHandler implements InvocationHandler { /** * 被代理對象 */ private Object target; /** * 綁定業務對象並返回一個代理類 */ public Object bind(Object target) { this.target = target; //經過反射機制,建立一個代理類對象實例並返回。用戶進行方法調用時使用 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 接口方法 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; //方法執行前加一段邏輯 System.out.println("——————調用前處理——————"); //調用真正的業務方法 result=method.invoke(target, args); //方法執行前加一段邏輯 System.out.println("——————調用後處理——————"); return result; } }
四、測試code
public class JDKDynamicProxyDemo { public static void main(String[] args) { //被代理對象 Dog dog = new Dog(); //動態代理類對象 AnimalInvocationHandler animalInvocationHandler = new AnimalInvocationHandler(); //代理對象 Animal proxy = (Animal) animalInvocationHandler.bind(dog); proxy.eat(); } }
五、結果對象
——————調用前處理—————— Dog須要吃骨頭 ——————調用後處理——————