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;
}
}
}

解决方案 »

  1.   

    我的目的很简单,只是想输出source中的hello word!!
    但是运行报错,,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)
      

  2.   


    /*希望对你有用*/
    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();

    }
    }
      

  3.   


    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();
    }

    }

    }