中途访问新编译的程序

时间:2015-04-29 06:08:42

标签: java compilation java-compiler-api javacompiler

我正在使用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

1 个答案:

答案 0 :(得分:1)

实现你想要做的事情是非平凡的,但很容易通过一些类加载器魔术来实现。

你说它运行旧函数预先覆盖' ...这表明你正在从你从它获得它的同一个类加载器中创建这个类的实例。第一次。

我建议阅读ClassLoaders。

在高级别,您的算法应该:

  1. 创建java
  2. 编译类
  3. 创建一个ClassLoader,它是您当前的子级 类加载器。
  4. 使用此类加载器
  5. 加载在步骤2中编译的类
  6. 实例化该类或以其他方式使用它。
  7. 现在你看到有一个新版本......从1开始
  8. 我将尝试使用一些代码示例编辑此答案。