gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:36:27 25 4
gpt4 key购买 nike

我使用 ecj 进行遗传编程,并且构建了它,以便在运行后采用最适合的单个程序,并使用所创建的 lisp 代码中的函数创建一个 java 类。

然后我让我的程序编译 java 文件。无论如何,我可以在同一次运行中运行新编译的类文件吗?

我希望能够:

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

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

每次我创建新的 java 文件并编译时,它都会重写旧的文件。但每当稍后调用该类时,它都会运行旧的预覆盖函数。任何提示将不胜感激!

编辑:这里有一些非常基本的伪代码来展示我到目前为止所得到的内容,其中很多都是抽象的。假设在运行之前已经有一个 MathFunction.class 文件。

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. 创建java
  2. 编译类
  3. 创建一个类加载器,它是当前类加载器的子类加载器类加载器。
  4. 使用此类加载器加载在步骤 2 中编译的类
  5. 实例化该类或以其他方式使用它。
  6. 现在您看到有一个新版本...从 1 开始

我将尝试使用一些代码示例编辑此答案。

关于java - 在运行中访问新编译的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29935639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com