import java.net.URI;
import java.util.Arrays;import javax.tools.JavaCompiler;
import javax.tools.JavaFileObject;
import javax.tools.SimpleJavaFileObject;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;public class JiSuan { public static void main(String[] args) throws Exception {
String source = "public class TestMain { public static void main(String[] args) {System.out.println(\"Hello World!\");} }"; JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
JavaSourceFromString sourceObject=new JavaSourceFromString("TestMain", source);
Iterable<? extends JavaFileObject> fileObject=Arrays.asList(sourceObject);
CompilationTask task=compiler.getTask(null, fileManager, null, null, null, fileObject);
boolean flag = task.call();
if(flag){
ClassLoader loader=JiSuan.class.getClassLoader();
Class<?> clazz=loader.loadClass("TestMain");
} fileManager.close();
} static class JavaSourceFromString extends SimpleJavaFileObject {
String code;
JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.', '/')+ Kind.SOURCE.extension), Kind.SOURCE);
System.out.println(URI.create("string:///" + name.replace('.', '/')+ Kind.SOURCE.extension));
System.out.println(Kind.SOURCE);
this.code = code;
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
System.out.println(code);
return code;
}
}
}
但是运行报错,,Exception in thread "main" java.lang.ClassNotFoundException: TestMain
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at JiSuan.main(JiSuan.java:26)
/*希望对你有用*/
import java.io.File;
import java.io.FileWriter;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;
import javax.tools.JavaCompiler.CompilationTask;import com.bjsxt.proxy.Moveable;
import com.bjsxt.proxy.Tank;public class Test1 {
public static void main(String[] args) throws Exception{
String rt = "\r\n";
String src =
"package com.bjsxt.proxy;" + rt +
"public class TankTimeProxy implements Moveable {" + rt +
" public TankTimeProxy(Moveable t) {" + rt +
" super();" + rt +
" this.t = t;" + rt +
" }" + rt +
" Moveable t;" + rt +
" @Override" + rt +
" public void move() {" + rt +
" long start = System.currentTimeMillis();" + rt +
" System.out.println(\"starttime:\" + start);" + rt +
" t.move();" + rt +
" long end = System.currentTimeMillis();" + rt +
" System.out.println(\"time:\" + (end-start));" + rt +
" }" + rt +
"}";
String fileName = System.getProperty("user.dir")
+ "/src/com/bjsxt/proxy/TankTimeProxy.java";
File f = new File(fileName);
FileWriter fw = new FileWriter(f);
fw.write(src);
fw.flush();
fw.close();
//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();
}
}
package com.bjsxt.proxy;public interface Moveable {
void move();
}package com.bjsxt.proxy;import java.util.Random;
public class Tank implements Moveable { @Override
public void move() {
System.out.println("Tank Moving...");
try {
Thread.sleep(new Random().nextInt(10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}