现在的位置: 首页 > 综合 > 正文

使用自动生成java文件和自动编译的静态代理模式

2013年09月16日 ⁄ 综合 ⁄ 共 1922字 ⁄ 字号 评论关闭
public interface Moveable {
	void move();//
}
public class Car implements Moveable{
	@Override
	public void move() {
		System.out.println("我是卡车,出发开往目的地...");
	}
}
//动态代理1
public class Proxy {
	public static Object newProxyInstance(Moveable move){
		String rt="\r\n";
		String src="package proxy1.dynamic;"+rt;
			  src+="public class CarTimeProxy implements Moveable{"+rt;
			  src+="	private Moveable move;"+rt;
			  src+="	public CarTimeProxy(Moveable move){"+rt;
			  src+="		this.move=move;"+rt;
			  src+="	}"+rt;
			  src+="	@Override"+rt;
			  src+="	public void move(){"+rt;					  				
			  src+="		System.out.println(\"开始记录时间:\");"+rt;
			  src+="		long start=System.currentTimeMillis();"+rt;
			  src+="		move.move();"+rt;
			  src+="		System.out.println(\"共耗时:\"+(System.currentTimeMillis()-start));"+rt;
			  src+="	}"+rt;
			  src+="}"+rt;
	  //创建java文件
	  String filepath=System.getProperty("user.dir")+"/src/proxy1/dynamic";
	  File file=new File(filepath+"/CarTimeProxy.java");
	  try{
		if(!file.exists()){
			file.createNewFile();
		}
		FileWriter fw=new FileWriter(file);
		fw.write(src);
		fw.close();	
	  }catch(Exception e){e.printStackTrace();}
	  
	  //编译
		JavaCompiler javac=ToolProvider.getSystemJavaCompiler();
		StandardJavaFileManager javafile=javac.getStandardFileManager(null, null, null);
		String filename=filepath+"/CarTimeProxy.java";
		Iterable units=javafile.getJavaFileObjects(filename);
		CompilationTask t=javac.getTask(null, javafile, null, null, null, units);
		t.call();
		try {javafile.close();
		} catch (IOException e) {e.printStackTrace();}
		
	 //把刚才在D:/下生成的class文件CarTimeProxy.class加载进内存并生成实例对象
		URL[] urls;
		Object obj=null;
		try {
			urls = new URL[]{new URL("file:///D:/Workspaces/base/bin/")};
			URLClassLoader classload=new URLClassLoader(urls);
			Class clazz=classload.loadClass("proxy1.dynamic.CarTimeProxy");
			Constructor cons=clazz.getConstructor(Moveable.class);
			obj=cons.newInstance(move);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		return obj;
	}
}
public class Client {
	public static void main(String[] args) throws ClassNotFoundException {
		
		Moveable move=new Car();
		Moveable proxy=(Moveable) Proxy.newProxyInstance(move);
		proxy.move();
		/**
		 * 运行结果:
		 * 开始记录时间:
		 * 我是卡车,出发开往目的地...
		 * 共耗时:0
		 */
	}
}

抱歉!评论已关闭.