Возможна ли частичная компиляция с последующим запуском в Java?
Я пишу калькулятор интегралов на java и встала задача считывать входные данные типа String (например функция : xx3-9) и вставлять их в код. Для этого я создал отдельный java файл, который редактируется через Main.java. Main.java получает на входе функцию и вставляет ее в код. Но при компиляции остается старая функция, и Main не может изменить код второго .java файла. Есть ли возможность задержки компиляции, чтобы Main.java успевал изменить код в code.java и потом уже компилировал сам code.java?
Вот код code.java, Main.java заменяет "0000" на введеную функцию и закрывает скобку
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.DecimalFormat;
import java.util.Scanner;
public class code {
public static int func ( int func, int f, int s, double dx){
double[] members;
double g = (s - f) / dx;
DecimalFormat decimalFormat = new DecimalFormat("########");
int result = Integer.parseInt(decimalFormat.format(g));
int i = 0;
double a = f;
members = new double[result];
while (i < result) {
double sqa = (0000;
a = a + dx;
members[i] = sqa;
i++;
}
double sum = 0;
for (int x = 0; x < result; x++) {
sum = sum + members[x];
if ((x >= result)){
}
System.out.println(sum);
}
return 0;
}
public static void main(String[] args) throws
IOException {
func(0, 0, 10, 0.0001);
}
}
Вот код Main.java
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.DecimalFormat;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
public class Main {
public static String readFile(String filename) throws IOException {
File file = new File(filename);
int len = (int) file.length();
byte[] bytes = new byte[len];
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
assert len == fis.read(bytes);
} catch (IOException e) {
close(fis);
throw e;
}
return new String(bytes, "UTF-8");
}
public static void writeFile(String filename, String text) throws IOException {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(filename);
fos.write(text.getBytes("UTF-8"));
} catch (IOException e) {
close(fos);
throw e;
}
}
public static void close(Closeable closeable) {
try {
closeable.close();
} catch (IOException ignored) {
}
}
public static void main(String[] args) throws
IOException, InterruptedException {
Scanner sc = new Scanner(System.in);
System.out.println("Введите функцию:");
String funct = sc.nextLine();
for(int i=0; i<=2;i++){
String fileName = "src/code.txt";
String content = Files.lines(Paths.get(fileName)).reduce("", String::concat);
writeFile("src/code.java", content.replaceAll("0000", funct + ") * dx"));
}
code.main(args);
}
}
Ответы (1 шт):
Про частичную компиляцию сказать не могу, но вот способ, как можно автоматизировать двойную компиляцию.
Предположим, что в текущей директории у вас есть файлы src/Main.java и src/code.txt.
Создадите в текущей директории скрипт run.sh следующего содержания:
#!/usr/bin/env bash
set -e
javac -d . src/Main.java
java Main
javac -d . src/Code.java
java Code
Сделайте скрипт исполняемым:
chmod +x run.sh
Запустите:
./run.sh
PS: переименуйте имя класса из code в Code, в Java классы принято именовать с заглавной буквы. Кроме этого, чтобы предложенный вариант заработал, нужно убрать вызов Code.main(args) из класса Main.
PPS: при генерации Code.java добавляйте в него комментарий, что он сгенерирован автоматически. Это обезопасит вас от изменений в Code.java вместо исходного code.txt.