代碼使用了common-io,需要其jar
1 接口
- public?interface?Pruduct?{??
- ????void?selling();??
- }??
?2 書籍類
- public?class?Book?implements?Pruduct?{??
- ????@Override??
- ????public?void?selling()?{??
- ????????try?{??
- ????????????Thread.sleep(1000);??
- ????????????System.out.println("books?selling.....");??
- ????????}?catch?(InterruptedException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- }??
?3 定義日志類
- public?class?LogTranService{??
- ??
- ????public?static?void?before(){??
- ???????????
- ????????System.out.println("begin?log...");??
- ????}??
- ??
- ????public?static?void?after(){??
- ????????System.out.println("finish?log...");??
- ????}??
- ??
- }??
?4 定義時間類
- 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?
- import?java.lang.reflect.Method;??
- ??
- public?interface?InvocationHander?{??
- ????public?void?invoke(Object?o,Method?m);??
- }??
?
- 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 代理類
- 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+??
- ????????????"???}";??
- ????????}??
- ????????/*?
- ?????????*?總的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這個框架可以放很方便的操作文件??
- ????????}?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);??
- ????????//?call進行編譯??
- ????????t.call();??
- ????????try?{??
- ????????????fileMgr.close();??
- ????????}?catch?(IOException?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ??????????
- ????????//?load到內存??
- ????????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 測試
- 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();??
- ????}??
- } ?
?
?
=============僅供參考============