在网上学习了马士兵老师的设计模式视屏,过程中也有认真的做相应的笔记。在次分享我的一些
成果,方便大家的进一步学习。
1、接口
1publicinterfaceMoveable {2voidmove();3}
2、被代理的对象
1publicclassTankimplementsMoveable {23@Override4publicvoidmove() {56System.out.PRintln("Tank Moving...");7try{8Thread.sleep(newRandom().nextInt(10000));9}catch(InterruptedException e) {10e.printStackTrace();11}1213}1415}
3、测试主类
1publicclassTest {2publicstaticvoidmain(String[] args)throwsException{3String rt = "\r\n";45//代理类的字符串代码6String src =7"public class TankTimeProxy implements Moveable {"+rt+8" Moveable t;"+rt+910" public TankTimeProxy(Moveable t) {"+rt+11" this.t = t;"+rt+12" }"+rt+1314" @Override"+rt+15" public void move() {"+rt+16" long start = System.currentTimeMillis();"+rt+17" System.out.println(\"start time is \"+start);"+rt+18" t.move();"+rt+19" long end = System.currentTimeMillis();"+rt+20" System.out.println(\"end time is \"+end);"+rt+21" System.out.println(\"time is \"+(end - start));"+rt+22" }"+rt+23"}";2425//将字符串写入java文件********************************************************************************26String fileName = System.getProperty("user.dir")+"/src/TankTimeProxy.java";//放置在(根目录+文件名)下27File f =newFile(fileName);28FileWriter fw =newFileWriter(f);29//写入内容30fw.write(src);31fw.flush();32fw.close();3334//进行编译********************************************************************************************35//首先获得编译器36//compiler 为java编译器 即javac37//获得编译器对象38JavaCompiler compiler =ToolProvider.getSystemJavaCompiler();3940//参数含义 (编译诊断,locale,charset)41//管理动态生成的文件的StandardJavaFileManager对象42StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null,null);//默认值4344//根据参数获取多个java文件 返回java文件对象集45Iterable units =fileManager.getJavaFileObjects(fileName);4647//“编译任务”对象48JavaCompiler.CompilationTask task = compiler.getTask(null,fileManager,null,null,null,units);49task.call();//调用50fileManager.close();5152//************以上过程获得了java文件源码,编译java文件生成了相对应的class文件****************5354//***************以下过程为将class文件加载至内存,生成新对象*****************************55//Class.load() 是加载path路径的class文件56//URLClassLoader是将硬盘中的class文件加载进入5758//通过Url引入本地文件59URL[] urls =newURL[]{newURL("file:/"+System.getProperty("user.dir")+"/out/production/proxy")};//访问本地class文件,这里我用的是IntellijIDEA,默认生成的class文件的目录在 /out/production/ 下606162//去指定路径寻找class文件63URLClassLoader urlClassLoader =newURLClassLoader(urls);6465Class c = urlClassLoader.loadClass("TankTimeProxy");6667System.out.println(c);6869//执行70//c.newInstance(); 是调用空的构造方法7172//获得构造方法73//根据java虚拟机,每一个构造方法也相当于一个对象74Constructor constructor = c.getConstructor(Moveable.class);7576//产生新对象77Moveable m = (Moveable) constructor.newInstance(newTank());//new Tank()为构造方法的参数 即被代理对象7879m.move();8081}82}8384
4、执行结果