我将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。
在高水平上,你的算法应该去:
- 创建java
- 编译类
- 创建一个ClassLoader,它是您当前类加载器
- 使用这个类加载器加载在步骤2中编译的类
- 实例化类或以其他方式使用它
- 现在你看到有一个新的修订。。。从1开始
我将尝试用一些代码示例编辑这个答案。