亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

模式的秘密---代理模式

難度中級
時長 2小時 0分
學習人數
綜合評分9.70
184人評價 查看評價
9.8 內容實用
9.6 簡潔易懂
9.7 邏輯清晰
  • 代理模式定義
    查看全部
  • 設計模式之代理模式
    查看全部
  • 獲取當前路徑---System.getProperty("user.dir") FileUtils可以快速的對文件進行讀寫。
    查看全部
  • 總結回顧: 1、代理概念、分類及應用場景 為其他對象設置總代理,以控制對這個對象的訪問; 代理對象起到了中介的作用,去掉了某些功能,或增加了些額外的服務。 四類: Remote Proxy -- 客戶端服務器的模式 Virtual Proxy -- 資源消耗很大,或復雜的對象,需要延遲,需要時創建, Protect Proxy -- 保護和控制權限 Smart Reference Proxy -- 提供額外服務。 為什么只講智能引用代理? 使用得多:日志處理、權限管理、事務處理... 靜態代理(繼承、聚合) JDK動態代理實現日志處理的功能 模擬JDK動態代理實現:在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler。 調用jar包中某個類的方法,不能改源碼,AOP面向切面,增加額外事務邏輯。
    查看全部
    1 采集 收起 來源:課程總結

    2016-12-24

  • 上一講到代理,內部的業務邏輯是硬編碼的,如何實現真正的動態代理,動態的指定業務邏輯呢? 1.需要創建一個事務處理器,首先創建一個接口也就是InvocationHandler,為了模擬JDK,這里把接口的名字和JDK事務處理器名稱一樣,同樣寫一個方法叫做invoke(),用來表示對某個對象的某個方法進行業務處理,所以需要把某個對象以及對象的方法作為invoke()方法的參數傳遞進來,invoke(Object obj,Method method),方法作為參數使用到了java反射,需要把此包引入。這樣InvocationHandler接口就完成了。 2.創建事務處理實現類比如說時間代理TimerProxy,實現了InvocationHandler接口,這樣結構就成了 public class TimerProxy implements InvocationHandler{ @Override public void invoke(Object o, Method m) { //業務邏輯 method.invoke(目標對象,參數); //業務邏輯 } 需要將目標對象傳入,沒有參數可以不寫參數,創建代理對象的構造方法,初始化目標對象 3.在Proxy類的newProxyInstance()方法中,除了要把目標Class接口作為參數外,還需要把事務處理器InvocationHandler 傳進去,然后更改創建實例對象中硬編碼的部分用事務處理器方法替代即可。難點在于字符串的拼接。
    查看全部
  • 完善動態代理實現 首先得到系統編譯器,通過編譯器得到文件管理者,以獲取文件,然后編譯器執行編譯任務,完成編譯之后,將class文件加載到類加載器中,通過構造方法得到實例,然后調用newInstance()接收一個對象的實例并返回。 (1)拿到編譯器 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); (2)文件管理者 StandardJavaFileManager fileMgr = Compiler.getStandardFileManager(null,null,null); (3)獲取文件 Iterable units = fileMgr.getJavaFileObjects(filename); (4)編譯任務 CompilationTask t =compiler.getTask(null,fileMgr,null,null,null,units); (5)load到內存 ClassLoader cl = ClassLoader.getSystemClassLoader(); Class c = cl.loadClass(”com.imooc.proxy.$Proxy0”); (6)通過代理對象的構造器構造實例,并返回代理對象 Constructor ctr = c.getConstructor(infce); return ctr.newInstance(new Car());
    查看全部
  • 動態代理實現思路 實現功能;通過Proxy的newProxyInstance返回代理對象 1.聲明一段源碼(動態產生代理) 2.編譯源碼(JDK Compiler API),產生新的類(代理類) 3.將這個類load到內存當中,產生一個新的對象(代理對象) 4.return 代理對象
    查看全部
  • JDK動態代理與CGLIB動態代理區別
    查看全部
  • 總結:【動態代理】 1.被代理對象首先要實現某些接口 2.它在運行時生成class對象(代理類),該class需要實現一組interface 3.產生的代理類并不能做什么事情,必須實現InvocationHandler接口來接管實際的工作 4.想實現的功能是在handler中去實現的 動態代理實現步驟: 1.創建一個實現接口InvocationHandler的類,它必須實現Invoke方法 2.創建被代理的類以及接口 3.調用proxy的靜態方法,創建一個代理類 new ProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h); 4.通過代理調用方法
    查看全部
  • 動態創建動態代理類的方法:
    查看全部
  • 動態代理
    查看全部
  • 靜態代理:代理和被代理對象在代理之前是確定的。他們都實現相同的接口或者繼承相同的抽象類。 1)繼承方式實現代理:用car2繼承car,調用父類的move()方法。 【前提是car實現了Moveable接口】 2)聚合方式實現代理:用car3實現Moveable接口,然后將car傳入,調用car的move()方法。
    查看全部
  • 代理模式定義: 為其他對象提供一種代理,以控制這個對象的訪問。 遠程代理:為不同地理的對象,提供局域網代表對象。 虛擬代理:根據需要將資源消耗很大的對象進行延遲,真正需要的時候進行創建。 保護代理:控制對一個對象的訪問權限[訪問或操作] 智能引用代理:提供對目標對象額外的其他服務。
    查看全部
  • 一、JDK與CGLIB動態代理的區別 1、JDK:針對接口 · 只能代理【實現了接口的類】 · 沒有實現接口的類不能實現JDK的動態代理 2、CGLIB:針對類 · 針對類來實現代理的 · 對指定目標類產生一個子類,通過方法攔截【技術攔截】所有父類方法的調用 二、CGLIB:是一個強大的開源項目,可以在運行期擴展Java類與實現Java接口 eg: //CglibProxy.java private Enhancer enhancer=new Enhancer(); /** * 創建代理類 */ public Object getProxy(Class clazz){ //設置創建子類的類 enhancer.setSuperclass(clazz); //設置回調 enhancer.setCallback(this); //創建子類的實例 return enhancer.create(); } /** * obj 目標類的實例 * m 目標方法的反射對象 * args 方法參數 * proxy 代理類實例 */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("日志開始..."); //代理類調用父類的方法 proxy.invokeSuper(obj, args); System.out.println("日志結束..."); return null; }
    查看全部
  • JDK動態代理 1. 目的:動態產生代理,實現對【不同類】,【不同方法】的代理 2. java動態代理類,位于java.lang.reflect包下,一般涉及兩個類: (1)Interface InvocationHandler:該接口中僅定義了一個方法public object invoke(Object obj,Method method,Object[] args) 參數: obj:被代理類的對象 method:被代理的方法 args:被代理方法參數數組 返回值: Object:方法返回值 (2)Proxy:該類即為動態代理類: static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) 參數: loader:被代理類的類加載器,通過被代理類.getClass().getClassLoader()得到 interfaces:實現的接口,通過getClass().getInterfaces()得到 h:invocationHandler 返回值: 返回代理類的一個實例 3. 動態代理實現: (1) 創建一個代理h實現InvocationHandler接口,通過【構造方法接受被代理類】,并實現invoke方法,添加業務邏輯(實現原有功能并添加額外功能) (2) 在測試類中,通過共同實現接口的實例獲得代理對象,并實現方法,如Interface1 i = (Interface1)Proxy.newProxyInstance(classLoader,classInterfaces,h); (3) 通過動態代理對象i,調用其方法i.move();
    查看全部

舉報

0/150
提交
取消
課程須知
本課程是 Java 開發課程的高級課程,希望各位小伙伴們在學習本課程之前,了解以下內容: 1)初步具備面向對象的設計思維 2)了解多態概念 3)了解反射
老師告訴你能學到什么?
1、代理模式概念機分類 2、代理模式應用場景 3、掌握靜態代理、動態代理運用 4、理解JDK動態代理實現原理

微信掃碼,參與3人拼團

微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

友情提示:

您好,此課程屬于遷移課程,您已購買該課程,無需重復購買,感謝您對慕課網的支持!