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 楼答案
实现您想要做的事情是不平凡的,但是通过一些类加载器魔法很容易实现
事实上,你说“它正在运行旧函数预覆盖”。。。指示您正在使用第一次获得的类加载器创建该类的实例
我建议读一下类加载器
在较高的层次上,您的算法应该:
我将尝试用一些代码示例编辑这个答案