Скомпилируйте исходный код Java из строки и сохраните вывод в поток вместо файла

Эй, я хотел знать, возможно ли скомпилировать исходный код Java, который сохраняется в строке, и получать и выводить поток байт-кода, не записывая его в файл.

Если да, я хотел бы знать, как это сделать, и это сэкономит мне много времени, поскольку я пока не нашел ничего полезного.

Большое спасибо!


person tud_mb    schedule 24.08.2020    source источник
comment
Связанный вопрос: stackoverflow.com/q/11925497/2513200   -  person Hulk    schedule 25.08.2020
comment
Не совсем: / Просто чтобы дать вам, ребята, больше контекста: я работаю над платформой, которая генерирует файл jar из исходного кода, введенного пользователем, и исходных кодов, которые сохраняются в базе данных. Мы не можем просто создавать файлы .class локально, а затем добавлять их в банку и удалять. Я хочу добавить JarEntrys непосредственно в JarOutputStream, а затем добавить байт-код скомпилированного исходного кода. Поэтому я должен сохранить скомпилированный байт-код в памяти, а не создавать отдельный файл.   -  person tud_mb    schedule 25.08.2020
comment
Ну, в таком случае, пожалуйста, уточните свой вопрос - сложно предположить, что вы уже знаете о динамической компиляции и что именно вам нужно.   -  person Hulk    schedule 25.08.2020
comment
Я действительно новичок в динамической компиляции. Я много пробовал здесь и там со статической компиляцией, которая работала нормально, но это было не то, что я искал :/   -  person tud_mb    schedule 25.08.2020
comment
Я не уверен, поможет ли это в вашем случае использования, но есть способ взять сохраненный исходный код и выполнить его динамически с помощью такой библиотеки, как jOOR — github.com/jOOQ/jOOR Пример кода по ссылке выше: Supplier‹String› supplier = Reflect.compile( com.example.HelloWorld, package com.example;\n + класс HelloWorld реализует java.util.function.Supplier‹String› {\n + public String get() {\n + return \Hello World!\;\n + }\n + }\n).create(). получать(); // Печатает Hello World! System.out.println(supplier.get());   -  person Loathian    schedule 25.08.2020
comment
Указатель, указанный в этот комментарий движется в правильном направлении. Вы должны реализовать JavaFileManager. См., например. этот ответ. Он обрабатывает входную сторону, показывая, как возможна строка времени выполнения в качестве входных данных исходного кода, а также массив байтов для уже скомпилированной зависимости. Это должно быть просто, чтобы адаптировать его, а также настроить выходную сторону.   -  person Holger    schedule 25.08.2020
comment
Спасибо, ребята, за вашу помощь. Это очень помогло мне понять, что я должен делать, и openbook.rheinwerk-verlag.de/java7/ эта ссылка помогла мне добиться того, что я хотел сделать (даже на немецком языке)   -  person tud_mb    schedule 26.08.2020