1. 程式人生 > >java--02--動態代理

java--02--動態代理

處理器 hide 提交 string ces throws over tproxy system

技術分享圖片
 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代理)
View Code

接口, 要幹的活

技術分享圖片
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 
 9
@Override 10 public void update() { 11 System.out.println("目標對象, 修改數據..."); 12 13 } 14 15 }
View Code

代理對象不用實現接口

技術分享圖片
 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--動態代理