有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在运行中访问新编译的程序

我正在使用ecj进行遗传编程,我已经构建了它,因此它在运行后会采用最适合的单个程序,并使用创建的lisp代码创建一个java类和一个函数

然后我让我的程序编译java文件。我是否可以在同一次运行中运行新编译的类文件

我希望能够:

RunMain-->;创建Java-->;编译类-->;在新创建的类中调用函数-->;EndMainRun

到目前为止,在新创建的类中调用该方法时遇到问题

每次我创建新的java文件并进行编译时,它都会重写旧的文件。但无论何时以后调用该类,它都会运行旧函数pre-overwrite。任何提示都将不胜感激

编辑:这里有一些非常基本的伪代码来展示我到目前为止得到的东西,其中很多是抽象的。假设已经有一个MathFunction。类文件,然后再运行此

PseudoCode
Main(){
runGeneticProgrammingAlgorithm();
generateJavaFileFromBestFitIndividual(name = MathFunction.java) //Replaces old MathFunction.java
compile(MathFunction.java) //using JavaCompilerApi, replaces old MathFunction.class
double value = MathFunction.calculate(25);

旧函数返回-1作为值,新函数应该返回5,但它仍然返回-1。即使我把这些都放在一个循环中,它也会不断地吐出-1,-1,-1

编辑2:

尽管函数完全不同,我仍然让它返回相同的值。代码如下:

    URL[] urls = null;

    File dir = new File("src" + java.io.File.separator + "ec");

    URL url = dir.toURI().toURL();

    urls = new URL[] { url };

    ClassLoader cl = new URLClassLoader(urls);

    Class cls = cl.loadClass("ec.MathSolution");

    MathSolution mathFunction = (MathSolution) cls.newInstance();

    System.out.println(mathFunction.calculate(123.5));

编辑3:

在这里找到了一个惊人的来源:http://www.toptal.com/java/java-wizardry-101-a-guide-to-java-class-reloading


共 (1) 个答案

  1. # 1 楼答案

    实现您想要做的事情是不平凡的,但是通过一些类加载器魔法很容易实现

    事实上,你说“它正在运行旧函数预覆盖”。。。指示您正在使用第一次获得的类加载器创建该类的实例

    我建议读一下类加载器

    在较高的层次上,您的算法应该:

    1. 创建java
    2. 编译类
    3. 创建一个类加载器,它是当前 类加载器
    4. 使用这个类加载器加载在步骤2中编译的类
    5. 实例化类或以其他方式使用它
    6. 现在你看到有一个新的版本。。。从1开始

    我将尝试用一些代码示例编辑这个答案