生活随笔
收集整理的這篇文章主要介紹了
java中的动态代理----自己手动实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼使用了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 定義時間類
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?{??????????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+??????????????"???}";??????????}??????????????????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+??????????"}";??????????????????????????String?filename?=??System.getProperty("user.dir")+"/bin/"+packageName+"/"+proxyClassName+".java";??????????File?file?=?new?File(filename);??????????try?{??????????????System.out.println(filename);??????????????FileUtils.writeStringToFile(file,?javaCode);????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}??????????????????????????????????????JavaCompiler?compiler?=?ToolProvider.getSystemJavaCompiler();??????????????????StandardJavaFileManager?fileMgr?=?compiler.getStandardFileManager(null,?null,?null);??????????????????Iterable?units?=?fileMgr.getJavaFileObjects(filename);????????????????????????????CompilationTask?t??=?compiler.getTask(null,?fileMgr,?null,?null,?null,?units);??????????????????t.call();??????????try?{??????????????fileMgr.close();??????????}?catch?(IOException?e)?{??????????????e.printStackTrace();??????????}????????????????????????????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 測試
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();??????}??} ??
?
=============僅供參考============
轉載于:https://www.cnblogs.com/xm1-ybtk/p/5099325.html
總結
以上是生活随笔為你收集整理的java中的动态代理----自己手动实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。