Компилировать источник java из String без записи в файл
Здесь Я нашел хороший пример:
// Prepare source somehow.
String source = "package test; public class Test { static { System.out.println(\"hello\"); } public Test() { System.out.println(\"world\"); } }";
// Save source in .java file.
File root = new File("/java"); // On Windows running on C:\, this is C:\java.
File sourceFile = new File(root, "test/Test.java");
sourceFile.getParentFile().mkdirs();
new FileWriter(sourceFile).append(source).close();
// Compile source file.
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
// Load and instantiate compiled class.
URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
Class<?> cls = Class.forName("test.Test", true, classLoader); // Should print "hello".
Object instance = cls.newInstance(); // Should print "world".
System.out.println(instance); // Should print "[email protected]".
Вопрос: Можно ли достичь точно такой же вещи без записи в файл?
@Edit:
Точнее: я знаю, как скомпилировать из строки (перегрузка JavaFileObject). Но после этого я понятия не имею, как загрузить класс. Я, вероятно, пропустил часть вывода-записи, но это тоже то, чего я бы не хотел делать.
@Edit2
Для всех, кого это интересует, я создал этот небольшой проект для реализации обсуждаемой функции: https://github.com/Krever/JIMCy
Ответы
Ответ 1
ОК, поэтому здесь является примером использования JavaCompiler
для компиляции с входа String
. этот файл является его ядром.
В этот файл, я загружаю класс, который скомпилирован. Вы заметите, что я также обнаруживаю пакет и имя класса с помощью регулярных выражений.
Что касается вывода, если вы хотите сделать это в памяти, кажется, что вы можете сделать это, если вы реализуете свой собственный JavaFileManager
; однако я никогда не пробовал это!
Обратите внимание, что вы можете отлаживать то, что происходит довольно легко, расширяя ForwardingJavaFileManager
Ответ 2
Не совсем то, о чем вы просите, но библиотека Groovy для Java упрощает компиляцию и оценку выражений из String. Синтаксис не идентичен, но очень похож на Java, поэтому, если вы можете изменить строки, которые нужно скомпилировать, чтобы они находились в Groovy вместо Java, задача будет очень простой. См. Вложение Groovy для образцов кода.