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



我将ecj用于遗传编程,我已经构建了它,以便在运行后获得最适合的单个程序,并使用创建的lisp代码创建一个带有函数的java类。

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

我希望能够:

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

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

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

编辑:这里有一些非常基本的伪代码来展示我到目前为止所拥有的,其中很多都是抽象的。假设在我运行这个之前已经有一个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

实现您想要做的事情很简单,但使用一些类加载器的魔力很容易实现。

事实上,你说"它正在运行旧功能预覆盖"。。。表示您正在从第一次获得的类加载器中创建该类的实例。

我建议阅读ClassLoaders。

在高水平上,你的算法应该去:

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

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

相关内容

  • 没有找到相关文章

最新更新