Возможна ли частичная компиляция с последующим запуском в 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 шт):

Автор решения: Vadik

Про частичную компиляцию сказать не могу, но вот способ, как можно автоматизировать двойную компиляцию.

Предположим, что в текущей директории у вас есть файлы 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.

→ Ссылка