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