2015-04-29 3 views
0

Я использую ecj для генетического программирования, и я его построил, поэтому после запуска он выбирает подходящую индивидуальную программу и создает класс java с функцией из созданного lisp-кода ,Доступ к недавно скомпилированному среднему запуску программы

У меня тогда есть моя программа скомпилировать java-файл. Есть ли в любом случае я могу запустить вновь скомпилированный файл класса в том же запуске?

Я хочу, чтобы иметь возможность:

RunMain -> Создание Java -> Compile класса -> Функция вызова во вновь созданного класса -> 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 ....

Edit 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)); 

Edit 3:

Обнаружили удивительный источник онлайн здесь: http://www.toptal.com/java/java-wizardry-101-a-guide-to-java-class-reloading

+0

показать этот файл и командную серию, которую вы использовали до сих пор !!! –

ответ

1

Достижение то, что вы хотите сделать, это нетривиальное, но легко можно с некоторой магией загрузчика классов.

Тот факт, что вы говорите, что он запускает старую функцию pre-overwrite, указывает на то, что вы создаете экземпляр этого класса из того же загрузчика классов, который вы получили с первого раза.

Предлагаю прочитать на ClassLoaders.

На высоком уровне вашего алгоритм должен идти:

  1. Создание Java
  2. Compile класса
  3. Создать ClassLoader, что является потомком текущего загрузчика классов.
  4. Загрузите класс, скомпилированный на шаге 2, используя этот загрузчик классов
  5. Создайте класс или иным образом используйте его.
  6. Теперь вы видите, есть новая версия ... начиная с 1

Постараюсь изменить этот ответ с некоторыми примерами кода.

+0

Да! Это звучит точно так, как мне нужно! – KrispyK

+0

Нужно ли мне разрабатывать образцы кода? Или вы на пути? – Anup

+0

Было уже поздно и лег спать прошлой ночью. Теперь я займусь этим, и я дам вам знать, как это происходит! Спасибо – KrispyK

Смежные вопросы