java--02--動態代理
阿新 • • 發佈:2018-01-03
處理器 hide 提交 string ces throws over tproxy system
View Code
1 動態代理, 2 1)代理對象,不需要實現接口; 3 2)代理對象的生成,是利用JDK API, 動態的在內存中構建代理對象(需要我們指定創建 代理對象/目標對象 實現的接口的類型;); 4 3) 動態代理, JDK代理, 接口代理; 5 6 JDK中生成代理對象的API: 7 |-- Proxy 8 static Object newProxyInstance( 9 ClassLoader loader, 指定當前目標對象使用類加載器 10 Class<?>[] interfaces, 目標對象實現的接口的類型11 InvocationHandler h 事件處理器 12 ) 13 14 15 動態代理總結: 16 代理對象不需要實現接口,但是目標對象一定要實現接口;否則不能用動態代理! 17 (class $Proxy0 implements IuserDao) 18 19 思考: 20 有一個目標對象,想要功能擴展,但目標對象沒有實現接口,怎樣功能擴展? 21 Class UserDao{} 22 // 子類的方式 23 Class subclass extends UserDao{} 24 25 以子類的方式實現(cglib代理)
接口, 要幹的活
1 public interface IUserDao { 2 3 void save(); 4 5 void update(); 6 }View Code
目標對象必須實現接口
1 // 目標對象 2 public class UserDao implements IUserDao{ 3 4 @Override 5 public void save() { 6 System.out.println("目標對象,插入數據到DB中..."); 7 } 8 9View Code@Override 10 public void update() { 11 System.out.println("目標對象, 修改數據..."); 12 13 } 14 15 }
代理對象不用實現接口
1 public class ProxyFactory { 2 private Object target; 3 public ProxyFactory(Object target){ 4 this.target = target; 5 } 6 7 public Object getProxyInstance(){ 8 9 return Proxy.newProxyInstance( 10 target.getClass().getClassLoader(), 11 target.getClass().getInterfaces(), 12 new InvocationHandler(){ 13 14 @Override 15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 16 System.out.println("開啟事務"); 17 Object value = method.invoke(target, args);//== target.... args是方法的參數 18 System.out.println("提交事務"); 19 return value; 20 } 21 22 } 23 24 ); 25 } 26 }View Code
幹吧...
1 public class ProxyTest { 2 3 public static void main(String[] args) { 4 //2.動態代理 5 IUserDao target = new UserDao(); 6 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); 7 proxy.save(); 8 proxy.update(); 9 /* 10 開啟事務 11 目標對象,插入數據到DB中... 12 提交事務 13 14 開啟事務 15 目標對象, 修改數據... 16 提交事務 17 */ 18 } 19 }View Code
java--02--動態代理