如何将文本文件中的Java代码行嵌入到Java程序中并执行
当然可以实现,以下是两种实用方案
方案1:用Java脚本引擎快速执行代码片段
Java自带脚本引擎,能直接解析执行Java代码字符串,适合处理像System.out.println(13);这种简单语句。直接修改你的代码即可:
import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import java.io.File; import java.util.Scanner; public class RunCodeFromTxt { public static void main(String[] args) { File sampleCode = new File("sample.txt"); // 获取支持Java代码的脚本引擎 ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); try (Scanner scan = new Scanner(sampleCode)) { while (scan.hasNextLine()) { String codeLine = scan.nextLine(); // 直接执行每行代码 engine.eval(codeLine); } } catch (Exception e) { e.printStackTrace(); } } }
运行后,文本里的System.out.println(13);就会被执行,输出13而不是打印代码本身。
方案2:动态编译类(适合复杂代码场景)
如果文本里的代码更多、逻辑更复杂,你可以把这些代码包装成完整的Java类,用Java Compiler API动态编译成字节码,再加载执行。比如:
假设你的sample.txt里有多行代码:
System.out.println(13);
System.out.println("动态执行的代码");
可以用下面的代码实现:
import javax.tools.JavaCompiler; import javax.tools.ToolProvider; import java.io.File; import java.io.FileWriter; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.Scanner; public class DynamicCodeRunner { public static void main(String[] args) { File sampleCode = new File("sample.txt"); StringBuilder classCode = new StringBuilder(); // 把文本代码包装成合法的Java类 classCode.append("public class TempDynamicCode {\n"); classCode.append(" public static void execute() {\n"); try (Scanner scan = new Scanner(sampleCode)) { while (scan.hasNextLine()) { // 缩进代码,保证类结构合法 classCode.append(" ").append(scan.nextLine()).append("\n"); } } catch (Exception e) { e.printStackTrace(); return; } classCode.append(" }\n"); classCode.append("}\n"); try { // 写入临时Java文件 File tempJavaFile = new File("TempDynamicCode.java"); FileWriter writer = new FileWriter(tempJavaFile); writer.write(classCode.toString()); writer.close(); // 编译临时类 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); compiler.run(null, null, null, tempJavaFile.getAbsolutePath()); // 加载编译后的类并执行方法 URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{new File(".").toURI().toURL()}); Class<?> dynamicClass = classLoader.loadClass("TempDynamicCode"); Method executeMethod = dynamicClass.getMethod("execute"); executeMethod.invoke(null); // 清理临时文件(可选) tempJavaFile.delete(); new File("TempDynamicCode.class").delete(); } catch (Exception e) { e.printStackTrace(); } } }
这个方法更灵活,哪怕文本里是多行业务代码,只要能组成合法的Java方法内容,就能被执行。
内容的提问来源于stack exchange,提问作者walbag
相关产品推荐
相关产品推荐

