从java 反射看延迟加载(代理模式)(七)——jdkproxy实现原理

来源:互联网 发布:黑客网站攻击软件 编辑:程序博客网 时间:2024/05/16 16:11

  这篇博客还没有完成……

  我上篇博客你可以看到,虽然只是个move的方法,但是move的时候我还希望它把执行时间返回来怎么办,拓展来说,我还希望它能打印日志怎么办?这些事情每次都要重复做,降低了好多效率。所以,你通过代理,代理类里面写了执行时间的代码,这样子你写tank类的时候,专心写你的move方法就好了。

动态代理底层代码——文件写入实现class的创建


静态代码是通过new来实例化的,我们假设,newProxyInstance这个方法能够帮我们实例化对象。
Proxy里面的代码如下:


package zhangsisi;import java.io.File;import java.io.FileWriter;import java.io.IOException;public class Proxy {     public static Object newProxyInstance() throws Exception{     String rn="\r\n";    String src=""+     " package zhangsisi;"+ rn+     "public class tankcreate implements Moveable{"+ rn+        "private Moveable tank;"+ rn+       "public tankcreate(Moveable tank) {"+ rn+     "super();"+ rn+     "this.tank = tank;"+ rn+     "}"+ rn+     "@Override"+ rn+     "public void move() {"+ rn+     "System.out.println(\"这是timeTankProxy做的时间分割开始\");"+ rn+     "tank.move();"+ rn+     "System.out.println(\"这是timeTankProsy做的时间分割结束\");"+ rn+     "}"+ rn+     "}";        String filename=System.getProperty("user.dir") + "/src/zhangsisi/tankcreate.java";    File f=new File(filename);        FileWriter fw;fw = new FileWriter(f);fw.write(src);fw.flush();    fw.close();         return null;     }


//compileJavaCompiler 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();fileMgr.close();
//load into memory and create an instanceURL[] urls = new URL[] {new URL("file:/" + System.getProperty("user.dir") +"/src")};URLClassLoader ul = new URLClassLoader(urls);Class c = ul.loadClass("com.bjsxt.proxy.TankTimeProxy");System.out.println(c);Constructor ctr = c.getConstructor(Moveable.class);Moveable m = (Moveable)ctr.newInstance(new Tank());m.move();

0 0
原创粉丝点击