-
靜態代理模式: extend(繼承):復寫父類方法實現。 imp(聚合):private一個類,添加構造方法。重寫接口的方法實現。 聚合方法更好。查看全部
-
遠程代理: 為不同地理的對象,提供局域網代表對象.案例(連鎖店監控各個分店的運營情況) 虛擬代理: 根據需要將資源消耗很大的對象進行延遲,真正需要的時候進行創建.案例(帖子中圖片還沒加載出來的時候,用一個空白圖片代理) 保護代理: 控制一個對象的訪問權限.案例(沒登錄時候瀏覽帖子,不嫩評論和刪除等操作) 智能引用代理: 提供目標對象額外的一些服務查看全部
-
動態代理流程圖查看全部
-
靜態代理: 聚合的方式就是一個類中調用另一個對象(裝飾模式),要實現另一個對象的接口 繼承的方式查看全部
-
string fliename= system.getProperty("user.dir")+"....."查看全部
-
jdk中的代理類的名字叫做$Proxy0查看全部
-
動態代理的實現步驟查看全部
-
代理模式-動態代理查看全部
-
ddddddddd查看全部
-
總結回顧: 1、代理概念、分類及應用場景 為其他對象設置總代理,以控制對這個對象的訪問; 代理對象起到了中介的作用,去掉了某些功能,或增加了些額外的服務。 四類: Remote Proxy -- 客戶端服務器的模式 Virtual Proxy -- 資源消耗很大,或復雜的對象,需要延遲,需要時創建, Protect Proxy -- 保護和控制權限 Smart Reference Proxy -- 提供額外服務。 為什么只講智能引用代理? 使用得多:日志處理、權限管理、事務處理... 靜態代理(繼承、聚合) JDK動態代理實現日志處理的功能 模擬JDK動態代理實現:在代理類Proxy和被代理類RealSubject之間,加入了invocationHandler。 調用jar包中某個類的方法,不能改源碼,AOP面向切面,增加額外事務邏輯。查看全部
-
上一講到代理,內部的業務邏輯是硬編碼的,如何實現真正的動態代理,動態的指定業務邏輯呢? 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自從1.3版本開始,就引入了動態代理,JDK的動態代理用起來非常簡單,但是它有一個限制,就是使用動態代理的對象必須實現一個或多個接口 。如果想代理沒有實現接口的類可以使用CGLIB包。 CGLIB(Code Generation Library)是一個開源項目。是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java接口。Hibernate用它來實現PO(Persistent Object 持久化對象)字節碼的動態生成。 注意:CGLIB不能對“final”修飾的類進行代理。 相關代碼——(下): @CglibProxy.java public class CglibProxy implements MethodInterceptor { private Enhancer enhancer=new Enhancer(); public Object getProxy(Class cls){ //設置創建子類的類 enhancer.setSuperclass(cls); enhancer.setCallback(this); return enhancer.create(); } /** * 參數:object:攔截所有目標類方法的調用,method:目標方法的反射對象,args:方法的參數,methodproxy:代理類的實例。 */ public Object intercept(Object object, Method method, Object[] args, MethodProxy methodproxy) throws Throwable { syso("日志開始..."); methodproxy.invokeSuper(object, args); syso("日志結束..."); return null; } }查看全部
-
/* * 仔細理解一下, 就是一層層嵌套疊加。。。 * 先調用ctp.move(); 輸出 “汽車開始行駛...” * clp參數傳到ctp.move()中的m.move方法;調用clp.move(),輸出 “日志開始...” * car參數傳到clp.move()中m.move方法;調用Car對象中的move方法。輸出 “汽車行駛中....” * 然后調完clp.move()返回,輸出 “日志結束...” * 調完返回ctp.move()返回,輸出“汽車結束行駛... 汽車行駛時間: 毫秒” * */查看全部
舉報
0/150
提交
取消