动态编译可以在运行时编译java源代码生成class文件,为动态代理提供了基础。
可以使用jdk,cglib, asm实现动态编译,下面举例用jdk实现动态编译。
public class DynamicFactory {
public static final String BR = System.getProperty("line.separator");
public static Object create() throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InterruptedException{
String src =
"package proxy;" + BR +
"" + BR +
"public class Programmer implements Worker{" + BR +
"" + BR +
" private String language;" + BR +
"" + BR +
" public Programmer(String language){" + BR +
" this.language = language;" + BR +
" }" + BR +
"" + BR +
" @Override" + BR +
" public void work() {" + BR +
" System.out.println(\"I use \" + language + \" to earn money~\");" + BR +
" }" + BR +
"}";
// output the src to a source file
final String userDir = System.getProperty("user.dir");
String fileName = userDir + "/src/proxy/Programmer.java";
FileWriter fw = new FileWriter(fileName);
fw.write(src);
fw.flush();
fw.close();
// use jdk to compile the java file
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null);
Iterable units = fileMgr.getJavaFileObjects(fileName);
CompilationTask task = compiler.getTask(null, fileMgr, null, null, null, units);
task.call();
fileMgr.flush();
fileMgr.close();
//load the class
URL[] urls = new URL[]{new URL("file:/" + userDir + "/src/")};
URLClassLoader loader = new URLClassLoader(urls);
Class c = loader.loadClass("proxy.Programmer");
System.out.println(c);
// create the instance
Constructor constructor = c.getConstructor(String.class);
Object o = constructor.newInstance("java");
System.out.println("class instance: " + o);
return o;
}
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InterruptedException {
Worker worker = (Worker)DynamicFactory.create();
worker.work();
}
}
输出结果:
class proxy.Programmer
class instance: proxy.Programmer@13cbbbf
I use java to earn money~