-
3、將這個類load到內存當中,產生一個新的對象(代理對象); //load到內存 ClassLoader cl = ClassLoader.getSystemClassLoader(); Class c = cl.loadClass(“com.imooc.proxy.$Proxy0”); Constructor ctr = c.getConstructor(infuse);//傳入接口參數 ctr.newInstance();//產生代理類的對象 4、return代理對象。 JDK動態代理,只能代理實現了接口的類,沒有實現接口的類不能實現JDK的動態代理。 CGLIB動態代理,針對類來實現代理,對指定目標類產生一個子類,通過方法攔截技術攔截所有父類方法的調用。查看全部
-
動態代理實現思路 實現功能:通過newProxyInstance返回代理對象, 1、聲明一段源碼(動態產生代理); 將源碼注釋掉存到一個str里; 可以創建事務處理器,動態處理業務邏輯,見3.3節; 寫個繼承自InvocationHandler的子類,將邏輯放在invoke方法中,兩個參數(類對象和方法) 給newProxyInstance多一個參數InvocationHandler; 在str中還要把它的import引入加上。 2、編譯源碼(JDK Compile API),產生新的類(代理類); 通過java文件編譯,String filename = System.getProperty(“user.dir”) + “/bin/com/imooc/proxy/$Proxy.java”; File file = new File(filename); 加入jar包,common-o.jar , 快速對文件進行讀寫刪除操作。 FileUtils.writeStringToFile(file, str); 實現對任意對象任意接口。。。 //拿到編譯器 JavaCompiler complier = ToolProvider.getSystemJavaCompiler(); //文件管理者 StandardJavaFileManager fileMgr = complier.getStandardFileManager(null,null,null);//diagnosticListener, locale,charset //獲取文件 Iterable units = fileMgr.getJavaFileObjects(filename); //編譯任務 CompilationTask t = complier.getTask(null, fileMgr, null,null,units); //進行編譯 t.call(); fileMgr.close();查看全部
-
動態產生代理,實現對不同類、不同方法的代理。 使用JDK動態產生代理(測試代碼Client類): Proxy.newProxyInstance(loader, interfaces, h); 參數1:類加載器;參數2:實現接口;參數3:InvocationHandler時間處理器。 測試示例: Car car = new Car(); InvocationHandler h = new TimeHandler(car); Class<?> cls = car.getClass(); Moveable m = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h); m.move()查看全部
-
靜態代理:聚合+繼承 聚合:在一個類中調用另一個對象,把參數傳入進來,執行其業務邏輯。 聚合比繼承更適合代理模式 實現功能疊加,增加日志處理、增加權限管理、在move方法外層添加方法實現運行時間處理功能、實體對象方法move。 如果用繼承方式實現功能疊加,代理類將無限疊加下去。查看全部
-
總結回顧: 1、代理概念、分類及應用場景 為其他對象設置總代理,以控制對這個對象的訪問; 代理對象起到了中介的作用,去掉了某些功能,或增加了些額外的服務。 四類: Remote Proxy,客戶端服務器的模式 Virtual Proxy,資源消耗很大,或復雜的對象,需要延遲,需要時創建, Protect Proxy, 保護和控制權限 Smart Reference Proxy,提供額外服務。 為什么只講智能引用代理? 使用得多:日志處理、權限管理、事務處理... 靜態代理(繼承、聚合) JDK動態代理實現日志處理的功能 模擬JDK動態代理實現:在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler。 調用jar包中某個類的方法,不能改源碼,AOP面向切面,增加額外事務邏輯。查看全部
-
代理模式: 1、遠程代理 為不同地理的對象提供局域網代表對象。 2、虛擬代理 根據需要將資源消耗很大的對象進行延遲,真正需要的時候進行創建。 3、保護代理 控制用戶使用的權限,例如普通用戶沒有注冊只能瀏覽,注冊后才能發帖、刪除、評論。 4、智能引用代理(靜態代理+動態代理) 提供對目標對象額外的功能。查看全部
-
jdk動態代理的實現步驟查看全部
-
JDK動態代理與CGLIB動態代理的區別查看全部
-
代理模式: 1、聚合代理優先于繼承代理。因為實現功能疊加的情況下,聚合代理通過相互代理的方式可以實現功能的重用,但是如果使用繼承代理的話需要不斷地增加代理類,這將導致代理類的數量無限膨脹; Car car = new Car(); CarLogProxy clp = new CarLogProxy(car); CarTimeProxy ctp = new CarTimeProxy(clp); //CarTimeProxy ctp = new CarTimeProxy(car); //CarLogProxy clp = new CarLogProxy(ctp); 2、靜態代理只能代理一種類型的被代理類,換個類型的就不行了,這需要動態代理;查看全部
-
代理模式實現-靜態代理查看全部
-
動態代理實現步驟查看全部
-
JDK動態代理與CGLIB動態代理區別查看全部
-
動態代理的實現步驟查看全部
-
代理模式的實現-靜態代理查看全部
-
智能代理的兩種實現方式查看全部
舉報
0/150
提交
取消