Compiling/running .java 文件在运行时与反射
Compiling/running .java files at runtime vs. reflection
所以我遇到了这个问题。我们使用 Java 作为我们的 'scripting' 语言,因为我们已经将它用于其他一切,并且它不需要任何额外的第 3 方库。
目前我们正在通过反射执行运行时间代码。类似于:
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 等等,所以我担心这些解决方案可能 运行 在那里出现问题。这里的理想方法是什么?
使用Runtime.getRuntime().exec("javac SomeFile.java")
通过命令行编译Java个文件。
如果您不确定 javac
或 java
是否在 PATH 中,请尝试直接指定完整路径(即 C:\Program Files\Java\jdk1.8.0_xx\bin\javac
)或直接询问用户它在哪里.
But I'm not expecting most end users to have PATH setup and all that, so I'm concerned that these solutions could run into problems there.
使用 javax.tools
方法(在您链接到的问答中描述)不需要用户设置 $PATH
或 $JAVA_HOME
或 $CLASS_PATH
。 AFAIK,它只需要用户 运行 java
来自 JDK 安装。
Java 最终使用了 Nashorn JS 引擎。工作起来很有魅力!脚本更改不需要构建时工作流。
所以我遇到了这个问题。我们使用 Java 作为我们的 'scripting' 语言,因为我们已经将它用于其他一切,并且它不需要任何额外的第 3 方库。
目前我们正在通过反射执行运行时间代码。类似于:
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 等等,所以我担心这些解决方案可能 运行 在那里出现问题。这里的理想方法是什么?
使用Runtime.getRuntime().exec("javac SomeFile.java")
通过命令行编译Java个文件。
如果您不确定 javac
或 java
是否在 PATH 中,请尝试直接指定完整路径(即 C:\Program Files\Java\jdk1.8.0_xx\bin\javac
)或直接询问用户它在哪里.
But I'm not expecting most end users to have PATH setup and all that, so I'm concerned that these solutions could run into problems there.
使用 javax.tools
方法(在您链接到的问答中描述)不需要用户设置 $PATH
或 $JAVA_HOME
或 $CLASS_PATH
。 AFAIK,它只需要用户 运行 java
来自 JDK 安装。
Java 最终使用了 Nashorn JS 引擎。工作起来很有魅力!脚本更改不需要构建时工作流。