java中的動態代理----自己手動實現

代碼使用了common-io,需要其jar

1 接口

Java代碼??收藏代碼
  1. public?interface?Pruduct?{??
  2. ????void?selling();??
  3. }??

?2 書籍類

Java代碼??收藏代碼
  1. public?class?Book?implements?Pruduct?{??
  2. ????@Override??
  3. ????public?void?selling()?{??
  4. ????????try?{??
  5. ????????????Thread.sleep(1000);??
  6. ????????????System.out.println("books?selling.....");??
  7. ????????}?catch?(InterruptedException?e)?{??
  8. ????????????e.printStackTrace();??
  9. ????????}??
  10. ????}??
  11. }??

?3 定義日志類

Java代碼??收藏代碼
  1. public?class?LogTranService{??
  2. ??
  3. ????public?static?void?before(){??
  4. ???????????
  5. ????????System.out.println("begin?log...");??
  6. ????}??
  7. ??
  8. ????public?static?void?after(){??
  9. ????????System.out.println("finish?log...");??
  10. ????}??
  11. ??
  12. }??

?4 定義時間類

Java代碼??收藏代碼
  1. public?class?TimeTranService?{??
  2. ????static?long?bgn;??
  3. ??
  4. ????public?static?void?before(){??
  5. ????????bgn?=?System.currentTimeMillis();??
  6. ????????System.out.println("begin?time...??"?+?bgn);??
  7. ????}??
  8. ????public?static?void?after(){??
  9. ????????long?end?=?System.currentTimeMillis();??
  10. ????????System.out.println("end?time...??"?+?(end-bgn));??
  11. ????}??
  12. ??
  13. }??

?5 定義InvocationHander?

Java代碼??收藏代碼
  1. import?java.lang.reflect.Method;??
  2. ??
  3. public?interface?InvocationHander?{??
  4. ????public?void?invoke(Object?o,Method?m);??
  5. }??

?

Java代碼??收藏代碼
  1. import?java.lang.reflect.Method;??
  2. public?class?ProxyHander?implements?InvocationHander?{??
  3. ??
  4. ????private?Object?target;??
  5. ????public?ProxyHander(Object?target)?{??
  6. ????????this.target?=?target;??
  7. ????}??
  8. ????@Override??
  9. ????public?void?invoke(Object?o,?Method?m)?{??
  10. ????????try?{??
  11. ????????????TimeTranService.before();??
  12. ????????????LogTranService.before();??
  13. ????????????m.invoke(target);??
  14. ????????????LogTranService.after();??
  15. ????????????TimeTranService.after();??
  16. ????????}?catch?(Exception?e)?{??
  17. ????????????e.printStackTrace();??
  18. ????????}???
  19. ????}??
  20. }??

?6 代理類

Java代碼??收藏代碼
  1. import?java.io.File;??
  2. import?java.io.IOException;??
  3. import?java.lang.reflect.Constructor;??
  4. import?java.lang.reflect.Method;??
  5. ??
  6. import?javax.tools.JavaCompiler;??
  7. import?javax.tools.JavaCompiler.CompilationTask;??
  8. import?javax.tools.StandardJavaFileManager;??
  9. import?javax.tools.ToolProvider;??
  10. ??
  11. import?org.apache.commons.io.FileUtils;??
  12. public?class?Proxy?{??
  13. ????/*?
  14. ?????*?空的構造函數?
  15. ?????*/??
  16. ????private?Proxy(){??
  17. ????}??
  18. ????/*?
  19. ?????*?返回代理類?
  20. ?????*/??
  21. ????public?static?Object?newProxyInstance(Class?inter,InvocationHander?h){??
  22. ????????String?proxyClassName?=?"$Proxy3";??
  23. ????????String?packageName??=?inter.getPackage().getName();??
  24. ????????String?InHanderPackage?=?h.getClass().getPackage().getName();??
  25. ????????String?rt?=?"\r\n";//?換行??
  26. ????????String?methodCode?=?"";??
  27. ????????for?(Method?method:inter.getMethods())?{??
  28. ????????????methodCode+="???@Override"+rt+??
  29. ??????????????
  30. ????????????"???public?void?"+?method.getName()+"()?{"+rt+??
  31. ????????????"???????try{"+rt+??
  32. ????????????"???????????Method?method??=?"+inter.getName()+".class.getMethod(\""???
  33. ????????????+???????????method.getName()+???"\");"+rt+??
  34. ????????????"???????????h.invoke(this,method);??????"+rt+??
  35. ????????????"???????}catch(Exception?e?){"?+rt+??
  36. ????????????"???????????e.printStackTrace();"?+rt+??
  37. ????????????"???????}"+rt+??
  38. ????????????"???}";??
  39. ????????}??
  40. ????????/*?
  41. ?????????*?總的java代碼?
  42. ?????????*/??
  43. ????????String?javaCode=????
  44. ????????"package??"+packageName+";"+rt+??
  45. ????????"import?"+InHanderPackage+".InvocationHander;"+rt+??
  46. ??????????
  47. ????????"import?java.lang.reflect.Method;"+rt+??
  48. ????????"public?class?"+proxyClassName+"?implements?"+inter.getName()+"?{"+rt+??
  49. ????????"???public?"+proxyClassName+"("+InHanderPackage+".InvocationHander?h)?{"+rt+??
  50. ????????"???????super();"+rt+??
  51. ????????"???????this.h?=?h;"+rt+??
  52. ????????"???}"+rt+??
  53. ????????"???private?"+InHanderPackage+".InvocationHander?h;"+rt+??
  54. ????????methodCode+rt+??
  55. ????????"}";??
  56. ????????/*?
  57. ?????????*??生成java文件?
  58. ?????????*/??
  59. ????????//?生成文件路徑??
  60. ????????String?filename?=??System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";??
  61. ????????File?file?=?new?File(filename);??
  62. ????????try?{??
  63. ????????????System.out.println(filename);??
  64. ????????????FileUtils.writeStringToFile(file,?javaCode);//?commons-io這個框架可以放很方便的操作文件??
  65. ????????}?catch?(IOException?e)?{??
  66. ????????????e.printStackTrace();??
  67. ????????}??
  68. ??????????
  69. ??????????
  70. ????????//?編譯??拿到編譯器??
  71. ????????JavaCompiler?compiler?=?ToolProvider.getSystemJavaCompiler();??
  72. ????????//?文件管理??
  73. ????????StandardJavaFileManager?fileMgr?=?compiler.getStandardFileManager(null,?null,?null);??
  74. ????????//獲取文件??
  75. ????????Iterable?units?=?fileMgr.getJavaFileObjects(filename);??
  76. ??????????
  77. ????????//?編譯任務??
  78. ????????CompilationTask?t??=?compiler.getTask(null,?fileMgr,?null,?null,?null,?units);??
  79. ????????//?call進行編譯??
  80. ????????t.call();??
  81. ????????try?{??
  82. ????????????fileMgr.close();??
  83. ????????}?catch?(IOException?e)?{??
  84. ????????????e.printStackTrace();??
  85. ????????}??
  86. ??????????
  87. ????????//?load到內存??
  88. ????????ClassLoader?cl?=?ClassLoader.getSystemClassLoader();??
  89. ????????try?{??
  90. ????????????Class?c?=?cl.loadClass(packageName+"."+proxyClassName);??
  91. ????????????Constructor?ctr?=?c.getConstructor(InvocationHander.class);??
  92. ????????????System.out.println("代理類的名字為:"+c.getName()+"===========");??
  93. ????????????return?ctr.newInstance(h);??
  94. ????????}?catch?(Exception?e)?{??
  95. ????????????e.printStackTrace();??
  96. ????????}??
  97. ????????return?null;??
  98. ????}??
  99. }??

?7 測試

Java代碼??收藏代碼
  1. public?class?Client?{??
  2. ????public?static?void?main(String[]?args)?{??
  3. ????????Book?book?=?new?Book();??
  4. ????????InvocationHander?h?=?new?ProxyHander(book);??
  5. ????????Pruduct?m?=?(Pruduct)Proxy.newProxyInstance(Pruduct.class,h);??
  6. ????????m.selling();??
  7. ????}??
  8. } ?

?

?

=============僅供參考============

轉載于:https://www.cnblogs.com/xm1-ybtk/p/5099325.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/272500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/272500.shtml
英文地址,請注明出處:http://en.pswp.cn/news/272500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Code Project精彩系列(1)

ApplicationsCrafting a C# forms Editor From scratchhttp://www.codeproject.com/csharp/SharpFormEditorDemo.asp建立一個類似C#的環境, 實現控件拖拉,屬性Packet Capture and Analayzer網絡封包截獲http://www.codeproject.com/csharp/pacanal.aspA tool to cha…

linux進程---exec族函數(execl, execlp, execv, execvp, )解釋和配合fork的使用

exec族函數函數的作用: exec函數族的作用是根據指定的文件名找到可執行文件,并用它來取代調用進程的內容,換句話說,就是在調用進程內部執行一個可執行文件。這里的可執行文件既可以是二進制文件,也可以是任何L…

Code Project精彩系列(2)

Windows FormsFireball Resourcer把各種資源嵌入應用程序資源Window Hiding with C#隱藏窗體, 似乎是其它運行的窗體 JProper Threading in Winforms .NETWindows Forms User Settings in C#使用VS設置設定forms, coolA Pretty Good Splash Screen in C#一個自繪可愛屏幕A curt…

python bool值要注意的一些地方

1、像(),[],{}這三個是可以通過bool(()),bool([]),bool({})轉化為bool值的;且它們轉化后的結果為False。但是這三個值它本身并不等于False、切記不可以與False 直接進行比較。 #!/usr/bin/python #!coding:utf-8 import sysif __name__ "__main__":falseL…

system函數和popen函數使用方法

system int system(const char *command);system()函數的返回值如下: 成功,則返回進程的狀態值; 當sh不能執行時,返回127; 失敗返回-1; 其實是封裝后的exec,函數源代碼在…

前端必備知識點—SVG

基本內容什么是SVG? 全稱為Scalable Vector Graphics,是一種使用XML技術描述二維圖形的語言,簡單來說 - 矢量圖(不失真)SVG與HTML5的關系早在HTML5之前,存在SVG技術SVG文件擴展名為".svg"在HTML5出現之前,要在HTML頁面中引入SVG文件在HTML5出…

CocoaPods安裝和使用及問題:Setting up CocoaPods master repo

CocoaPods是什么? 當你開發iOS應用時,會經常使用到很多第三方開源類庫,比如JSONKit,AFNetWorking等等。可能某個類庫又用到其他類庫,所以要使用它,必須得另外下載其他類庫,而其他類庫又用到其他…

進程間的通信IPC(無名管道和命名管道)

進程間的通信IPC介紹 進程間通信(IPC,InterProcess Communication)是指在不同進程之間傳播或交換信息。 IPC的方式通常有管道(包括無名管道和命名管道)、消息隊列、信號量、共享存儲、Socket、Streams等。其中 Socket…

那些關于瀏覽器的趣圖和幽默段子

1、當瀏覽器化作一種槍,你喜歡用哪種呢?2、這神奇的反射弧,有點長…3、瀏覽器們成長的煩惱4、這么說來,IE瀏覽器扳回一分!5、如何用瀏覽器區分 HTML和 HTML56、都在吹牛,還是IE最務實!7、主流瀏…

前端新手程序員不知道的 20個小技巧

1.作為前端開發者,使用雙顯示器能大幅提高開發效率。2.學編程最好的語言不是PHP,是English。3.東西交付之前偷偷測試一遍。4.問別人之前最好先自己百度,google一下,以免問出太低級的問題。5.把覺得不靠譜的需求放到最后做&#xf…

IPC 共享內存和 消息隊列(發送、接收、移除)以及鍵值的生成

一、消息對列 消息隊列,是消息的鏈接表,存放在內核中。一個消息隊列由一個標識符(即隊列ID)來標識。 特點: 消息隊列是面向記錄的,其中的消息具有特定的格式以及特定的優先級。消息隊列獨立于發送與接收進…

DBA十大必備工具(SQLServer)

曾經和一些DBA和數據庫開發人員交流時,問他們都用過一些什么樣的DB方面的工具,大部分人除了SSMS和Profile之外,基本就沒有使用過其他工具了;誠然,SSMS和Profile足夠強大,工作的大部分內容都能通過它們搞定&…

linux 信號和信號量編程

對于 Linux來說,實際信號是軟中斷,許多重要的程序都需要處理信號。信號,為 Linux 提供了一種處理異步事件的方法。比如,終端用戶輸入了 ctrlc 來中斷程序,會通過信號機制停止一個程序。 信號概述 信號的名字和編號&…

安卓動畫基礎講解

//逐幀動畫 /** * 1.加入單張圖片 * 2.生成movie.xml整個圖片 * 3.代碼中使用圖片movie.xml */ iv(ImageView) findViewById(R.id.iv);// iv.setImageResource(R.drawable.movie);//為iv加載六張圖片// AnimationDrawable ad(AnimationDrawable) iv.getDrawable();//得到圖片給…

JS一些常用的類庫

一、返回上一頁(history)發覺有兩種用法:1、javascript:history.back(-1);2、javascript:history.go(-1);它們倆的區別是:history.back(-1):直接返回當前頁的上一頁,數據全部消息,返回新頁面history.go(-1)…

Linux上線程開發API概要(線程)

進程與線程 典型的UNIX/Linux進程可以看成只有一個控制線程:一個進程在同一時刻只做一件事情。有了多個控制線程后,在程序設計時可以把進程設計成在同一時刻做不止一件事,每個線程各自處理獨立的任務。 進程是程序執行時的一個實例&…

Redis學習筆記1-Redis數據類型

Redis數據類型 Redis支持5種數據類型,它們描述如下: Strings - 字符串 字符串是 Redis 最基本的數據類型。Redis 字符串是二進制安全的,也就是說,一個 Redis 字符串可以包含任意類型的數據,一個字符串最大為 512M 字節…

30個非常有趣的404錯誤頁面設計欣賞

當用戶訪問一個不存在的頁面的時候就會出現404錯誤頁面,這對用戶來說是很不友好的。所以很多網站都會去設計一個新穎的錯誤頁面,以吸引用戶繼續瀏覽其它的網頁內容。今天這篇文章就收集了30個非常有趣的404錯誤頁面設計欣賞,希望能帶給你靈感…

線程同步之互斥量加鎖解鎖 死鎖

與互斥鎖相關API 互斥量(mutex)從本質上來說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量上的鎖。對互斥量進行加鎖后,任何其他試圖再次對互斥量加鎖的線程將會被阻塞直到當前線程釋放該互…

游戲開發-從零開始 002

個人開發者的游戲大部分需要完成的內容: 1.完整的游戲玩法邏輯(核心) 2.UI 3.游戲關卡設計 4.游戲旁白 5.交互細節 6.游戲分享接口 7.游戲道具 8.游戲排行榜,游戲社區,如 GameCenter 9.游戲內購 如 remove Ads 10.廣告…