在运行时与反射编译/运行.java文件

时间:2015-06-21 00:39:12

标签: java reflection runtime

所以我遇到了这个问题。我们使用Java作为我们的“脚本”语言,因为我们已经将它用于其他所有内容,并且它不需要任何额外的第三方库。

现在我们正在通过反射执行运行时代码。类似的东西:

Class triggerAction = null;
    try {
        triggerAction = Class.forName(actionName);
        Gdx.app.log("Info", triggerAction.getName() + " attached to "
                + this.toString());
        try {
            this.triggerAction = (TriggerAction) triggerAction
                    .newInstance();
        } 

这很棒,但并不理想。任何要在运行时运行的java文件仍必须编译到最新版本中。理想情况下,非开发人员可以使用存储在'/ scripts /'目录中的脚本文件,然后运行程序并执行修改后的.java文件。这是我以前从未做过的事情,所以我对如何以对最终用户安全的方式进行处理有点不知所措。

我发现了这种方法: Generating, compiling and using Java code at run time?

但我不希望大多数最终用户拥有PATH设置和所有这些,所以我担心这些解决方案可能会遇到问题。这里的理想方法是什么?

3 个答案:

答案 0 :(得分:0)

使用Runtime.getRuntime().exec("javac SomeFile.java")通过命令行编译Java文件。

如果你不确定javacjava是否在PATH中,请尝试直接指定完整路径(即C:\Program Files\Java\jdk1.8.0_xx\bin\javac)或只是询问用户它在哪里

答案 1 :(得分:0)

  

但我不希望大多数最终用户拥有PATH设置和所有这些,所以我担心这些解决方案可能会遇到问题。

使用javax.tools方法(在您链接到的Q& A中描述)不需要用户设置$PATH$JAVA_HOME$CLASS_PATH。 AFAIK,它只需要用户从JDK安装运行java

答案 2 :(得分:0)

使用适用于Java的Nashorn JS引擎。像魅力一样工作!脚本更改不需要构建时工作流。