将一个简单的文本文件作为Java运行

我有一个简单的.txt文件,里面有纯Java代码

public class C { public static void main(String[] args ) { System.out.println("This is executed"); } } 

该文件名为C.txt。 现在我想编写将读取C.txt中的代码的Java代码,并将编译和运行读取代码作为纯Java文件。 注意,我可以轻松地将C.txt重命名为C.java并手动编译和运行代码。 但是,这不是我的意图。 我想按原样读取.txt文件并直接执行代码。 这有可能吗?

我想我会从BeanShell开始,它允许您编译和执行字符串中保存的Java源代码。

您可以使用javax.tools api表单Java 6来动态编译代码。 但是,由于您的扩展名是非法的,因此会报错:C.txt只有在明确请求注释处理时才接受类名

要解决此问题(如注释中所述),您必须首先将代码加载到String中,然后执行它:

 import javax.tools.JavaCompiler; import javax.tools.JavaFileObject; import javax.tools.SimpleJavaFileObject; import javax.tools.ToolProvider; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.Method; import java.net.URI; import java.util.Iterator; import java.util.NoSuchElementException; public class MyCompiler2 { public static void main(String[] args) throws Exception { String program = ""; try { BufferedReader in = new BufferedReader(new FileReader("C.txt")); String str; while ((str = in.readLine()) != null) { program += str; } in.close(); } catch (IOException e) { } JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); Iterable fileObjects; fileObjects = getJavaSourceFromString(program); compiler.getTask(null, null, null, null, null, fileObjects).call(); Class clazz = Class.forName("C"); Method m = clazz.getMethod("main", new Class[]{String[].class}); Object[] _args = new Object[]{new String[0]}; m.invoke(null, _args); } static Iterable getJavaSourceFromString(String code) { final JavaSourceFromString jsfs; jsfs = new JavaSourceFromString("code", code); return new Iterable() { public Iterator iterator() { return new Iterator() { boolean isNext = true; public boolean hasNext() { return isNext; } public JavaSourceFromString next() { if (!isNext) throw new NoSuchElementException(); isNext = false; return jsfs; } public void remove() { throw new UnsupportedOperationException(); } }; } }; } } class JavaSourceFromString extends SimpleJavaFileObject { final String code; JavaSourceFromString(String name, String code) { super(URI.create("string:///" + name.replace('.', '/') + Kind.SOURCE.extension), Kind.SOURCE); this.code = code; } public CharSequence getCharContent(boolean ignoreEncodingErrors) { return code; } } 

请注意您需要显式提供方法名,以便reflection执行代码。

看看这个线程如何从Java中开始编译…

如何通过CompilationTask设置编译源