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 */ } }