您的位置:首页 > 编程语言 > Java开发

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

2016-11-28 16:04 495 查看
  这篇博客还没有完成……  我上篇博客你可以看到,虽然只是个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;
}
//compile
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();
fileMgr.close();
//load into memory and create an instance
URL[] 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();

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: