日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java中的动态代理----自己手动实现

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中的动态代理----自己手动实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

1 接口

Java代碼??
  • public?interface?Pruduct?{??
  • ????void?selling();??
  • }??
  • ?2 書籍類

    Java代碼??
  • public?class?Book?implements?Pruduct?{??
  • ????@Override??
  • ????public?void?selling()?{??
  • ????????try?{??
  • ????????????Thread.sleep(1000);??
  • ????????????System.out.println("books?selling.....");??
  • ????????}?catch?(InterruptedException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • }??
  • ?3 定義日志類

    Java代碼??
  • public?class?LogTranService{??
  • ??
  • ????public?static?void?before(){??
  • ???????????
  • ????????System.out.println("begin?log...");??
  • ????}??
  • ??
  • ????public?static?void?after(){??
  • ????????System.out.println("finish?log...");??
  • ????}??
  • ??
  • }??
  • ?4 定義時(shí)間類

    Java代碼??
  • public?class?TimeTranService?{??
  • ????static?long?bgn;??
  • ??
  • ????public?static?void?before(){??
  • ????????bgn?=?System.currentTimeMillis();??
  • ????????System.out.println("begin?time...??"?+?bgn);??
  • ????}??
  • ????public?static?void?after(){??
  • ????????long?end?=?System.currentTimeMillis();??
  • ????????System.out.println("end?time...??"?+?(end-bgn));??
  • ????}??
  • ??
  • }??
  • ?5 定義InvocationHander?

    Java代碼??
  • import?java.lang.reflect.Method;??
  • ??
  • public?interface?InvocationHander?{??
  • ????public?void?invoke(Object?o,Method?m);??
  • }??
  • ?

    Java代碼??
  • import?java.lang.reflect.Method;??
  • public?class?ProxyHander?implements?InvocationHander?{??
  • ??
  • ????private?Object?target;??
  • ????public?ProxyHander(Object?target)?{??
  • ????????this.target?=?target;??
  • ????}??
  • ????@Override??
  • ????public?void?invoke(Object?o,?Method?m)?{??
  • ????????try?{??
  • ????????????TimeTranService.before();??
  • ????????????LogTranService.before();??
  • ????????????m.invoke(target);??
  • ????????????LogTranService.after();??
  • ????????????TimeTranService.after();??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}???
  • ????}??
  • }??
  • ?6 代理類

    Java代碼??
  • import?java.io.File;??
  • import?java.io.IOException;??
  • import?java.lang.reflect.Constructor;??
  • import?java.lang.reflect.Method;??
  • ??
  • import?javax.tools.JavaCompiler;??
  • import?javax.tools.JavaCompiler.CompilationTask;??
  • import?javax.tools.StandardJavaFileManager;??
  • import?javax.tools.ToolProvider;??
  • ??
  • import?org.apache.commons.io.FileUtils;??
  • public?class?Proxy?{??
  • ????/*?
  • ?????*?空的構(gòu)造函數(shù)?
  • ?????*/??
  • ????private?Proxy(){??
  • ????}??
  • ????/*?
  • ?????*?返回代理類?
  • ?????*/??
  • ????public?static?Object?newProxyInstance(Class?inter,InvocationHander?h){??
  • ????????String?proxyClassName?=?"$Proxy3";??
  • ????????String?packageName??=?inter.getPackage().getName();??
  • ????????String?InHanderPackage?=?h.getClass().getPackage().getName();??
  • ????????String?rt?=?"\r\n";//?換行??
  • ????????String?methodCode?=?"";??
  • ????????for?(Method?method:inter.getMethods())?{??
  • ????????????methodCode+="???@Override"+rt+??
  • ??????????????
  • ????????????"???public?void?"+?method.getName()+"()?{"+rt+??
  • ????????????"???????try{"+rt+??
  • ????????????"???????????Method?method??=?"+inter.getName()+".class.getMethod(\""???
  • ????????????+???????????method.getName()+???"\");"+rt+??
  • ????????????"???????????h.invoke(this,method);??????"+rt+??
  • ????????????"???????}catch(Exception?e?){"?+rt+??
  • ????????????"???????????e.printStackTrace();"?+rt+??
  • ????????????"???????}"+rt+??
  • ????????????"???}";??
  • ????????}??
  • ????????/*?
  • ?????????*?總的java代碼?
  • ?????????*/??
  • ????????String?javaCode=????
  • ????????"package??"+packageName+";"+rt+??
  • ????????"import?"+InHanderPackage+".InvocationHander;"+rt+??
  • ??????????
  • ????????"import?java.lang.reflect.Method;"+rt+??
  • ????????"public?class?"+proxyClassName+"?implements?"+inter.getName()+"?{"+rt+??
  • ????????"???public?"+proxyClassName+"("+InHanderPackage+".InvocationHander?h)?{"+rt+??
  • ????????"???????super();"+rt+??
  • ????????"???????this.h?=?h;"+rt+??
  • ????????"???}"+rt+??
  • ????????"???private?"+InHanderPackage+".InvocationHander?h;"+rt+??
  • ????????methodCode+rt+??
  • ????????"}";??
  • ????????/*?
  • ?????????*??生成java文件?
  • ?????????*/??
  • ????????//?生成文件路徑??
  • ????????String?filename?=??System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";??
  • ????????File?file?=?new?File(filename);??
  • ????????try?{??
  • ????????????System.out.println(filename);??
  • ????????????FileUtils.writeStringToFile(file,?javaCode);//?commons-io這個(gè)框架可以放很方便的操作文件??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??????????
  • ??????????
  • ????????//?編譯??拿到編譯器??
  • ????????JavaCompiler?compiler?=?ToolProvider.getSystemJavaCompiler();??
  • ????????//?文件管理??
  • ????????StandardJavaFileManager?fileMgr?=?compiler.getStandardFileManager(null,?null,?null);??
  • ????????//獲取文件??
  • ????????Iterable?units?=?fileMgr.getJavaFileObjects(filename);??
  • ??????????
  • ????????//?編譯任務(wù)??
  • ????????CompilationTask?t??=?compiler.getTask(null,?fileMgr,?null,?null,?null,?units);??
  • ????????//?call進(jìn)行編譯??
  • ????????t.call();??
  • ????????try?{??
  • ????????????fileMgr.close();??
  • ????????}?catch?(IOException?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ??????????
  • ????????//?load到內(nèi)存??
  • ????????ClassLoader?cl?=?ClassLoader.getSystemClassLoader();??
  • ????????try?{??
  • ????????????Class?c?=?cl.loadClass(packageName+"."+proxyClassName);??
  • ????????????Constructor?ctr?=?c.getConstructor(InvocationHander.class);??
  • ????????????System.out.println("代理類的名字為:"+c.getName()+"===========");??
  • ????????????return?ctr.newInstance(h);??
  • ????????}?catch?(Exception?e)?{??
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????????return?null;??
  • ????}??
  • }??
  • ?7 測(cè)試

    Java代碼??
  • public?class?Client?{??
  • ????public?static?void?main(String[]?args)?{??
  • ????????Book?book?=?new?Book();??
  • ????????InvocationHander?h?=?new?ProxyHander(book);??
  • ????????Pruduct?m?=?(Pruduct)Proxy.newProxyInstance(Pruduct.class,h);??
  • ????????m.selling();??
  • ????}??
  • } ?
  • ?

    ?

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

    轉(zhuǎn)載于:https://www.cnblogs.com/xm1-ybtk/p/5099325.html

    總結(jié)

    以上是生活随笔為你收集整理的java中的动态代理----自己手动实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。