在运行时加载java代码

时间:2015-03-17 14:09:12

标签: java file runtime external

我有一个小项目,我必须计算一个列表。计算取决于服务因素。 关键是这些因素会不时发生变化,应允许用户通过它自己改变这一点。

到目前为止,这些因素都是硬编码的,如果不重新编译代码,就无法进行任何更改。

目前代码如下:

    if (someStatement.equals("someString")) {
        computedList.remove("something");
        }

我的想法是制作一个可编辑且可读的文本文件,配置文件等,它在运行时/启动时加载?该文件应该包含上面的java代码。

任何想法如何做到这一点?请注意:目标PC没有安装JDK,只有JRE。

4 个答案:

答案 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;
}}

就是这样。希望它可以帮助其他有类似问题的人!