我有一个小项目,我必须计算一个列表。计算取决于服务因素。 关键是这些因素会不时发生变化,应允许用户通过它自己改变这一点。
到目前为止,这些因素都是硬编码的,如果不重新编译代码,就无法进行任何更改。
目前代码如下:
if (someStatement.equals("someString")) {
computedList.remove("something");
}
我的想法是制作一个可编辑且可读的文本文件,配置文件等,它在运行时/启动时加载?该文件应该包含上面的java代码。
任何想法如何做到这一点?请注意:目标PC没有安装JDK,只有JRE。
答案 0 :(得分:0)
实现此目的的有效方法是使用静态初始化程序。 Static Block in Java可以在此链接下找到简明扼要的解释。
答案 1 :(得分:0)
这里允许这样做的一个选项是使用来自swing API的用户输入对话 - 然后你可以将用户答案存储在变量中并将它们导出到文本文件/配置文件中,或者只是在程序中使用它们没有保存它们。您只需在程序的最开始弹出输入对话框,然后再发生其他任何事情,然后程序将根据这些响应运行。
答案 2 :(得分:0)
您可以使用Javascript作为配置文件语言,而不是java。 Java 7 SE及更高版本包含可以从Java调用的a javascript interpreter。它不难使用,你可以将java对象注入javascript环境。
基本上,您要创建一个Javascript环境,将java对象插入到配置文件应该配置的对象中,然后以javascript运行配置文件。
答案 3 :(得分:0)
好的,我们走了......我找到了一个非常简单的解决方案来解决我的问题。
我正在使用 Janino by Codehaus (Link)。这个库有一个集成的Java编译器,似乎像Java 7中的JavaCompiler
类一样工作。
但没有安装JDK。
通过Janino,您可以在运行时加载和编译* .java文件(人类可读),这正是我所需要的。
我认为他们主页上的示例和代码片段很痛苦,所以这是我自己的实现:
第一步是使用Java文件在运行时加载的相同方法实现一个接口:
public interface ZuordnungInterface {
public ArrayList<String> Zuordnung(ArrayList<String> rawList);}
然后在需要课程时调用Janino类加载器:
File janinoSourceDir = new File(PATH_TO_JAVAFILE);
File[] srcDir = new File[] { janinoSourceDir };
String encoding = null;
ClassLoader parentClassLoader = this.getClass().getClassLoader();
ClassLoader cl = new JavaSourceClassLoader(parentClassLoader, srcDir,
encoding);
并创建一个新实例
ZuordnungsInterface myZuordnung = (ZuordnungInterface) cl.loadClass("zuordnung")
.newInstance();
注意:加载的类名为zuordnung.java
,因此调用cl.loadClass("zuordnung")
中不需要扩展名。
最后我想在我的程序运行时加载和编译的类,它可以位于你想要的任何地方(PATH_TO_JAVAFILE):
public class zuordnung implements ZuordnungInterface {
public ArrayList<String> Zuordnung(ArrayList<String> rawList){
ArrayList<String> computedList = (ArrayList<String>) rawList.clone();
if (Model.getSomeString().equals("Some other string")) {
computedList.add("Yeah, I loaded an external Java class");
}
return computedList;
}}
就是这样。希望它可以帮助其他有类似问题的人!