Загрузка внешнего исходного кода и его внутреннее использование (путем повторной компиляции или чего-то еще)

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

Я хотел бы иметь программу, которую можно было бы изменить без редактирования полного исходного кода, и что это даже возможно без компиляции этого каждый раз. Еще одним преимуществом является то, что я могу изменять части кода по своему усмотрению.

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

И, конечно же, она должна быть быстрее, чем чистая система перевода.

Итак, есть ли способ сделать это, например, дополнительную компиляцию этих частей внешнего исходного кода и запуск программы после этого?

Заранее спасибо, Андреас :)


person Andreas Hornig    schedule 30.12.2009    source источник


Ответы (3)


Вам понадобится API javax.tools для этого. Таким образом, вам нужно установить по крайней мере JDK, чтобы заставить его работать (и пусть ваша IDE указывает на него вместо JRE). Вот базовый пример запуска (без надлежащего исключения и обработки кодирования, чтобы сделать базовый пример менее непрозрачным, кашель):

public static void main(String... args) throws Exception {
    String source = "public class Test { static { System.out.println(\"test\"); } }";

    File root = new File("/test");
    File sourceFile = new File(root, "Test.java");
    Writer writer = new FileWriter(sourceFile);
    writer.write(source);
    writer.close();

    JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
    compiler.run(null, null, null, sourceFile.getPath());

    URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
    Class<?> cls = Class.forName("Test", true, classLoader);
}

Это должно вывести test на стандартный вывод, как это делает статический инициализатор в исходном коде теста. Дальнейшее использование было бы более простым, если бы эти классы реализовывали определенный интерфейс, который уже находится в пути к классам. В противном случае вам необходимо задействовать Reflection API для доступа и вызова методов/ поля.

person BalusC    schedule 30.12.2009

В Java 6 или более поздних версиях вы можете получить доступ к компилятору через пакет javax.tools. ToolProvider.getSystemJavaCompiler() предоставит вам javax.tools .JavaCompiler, который можно настроить для компиляции исходного кода. Если вы используете более ранние версии Java, вы все равно можете получить доступ к ней через внутренний интерфейс com.sun.tools.javac.Main, хотя он намного менее гибкий.

person ataylor    schedule 30.12.2009

Java6 имеет API сценариев. Я использовал его с Javascript, но я считаю, что вы также можете компилировать внешний код Java.

http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/

Изменить. Вот более актуальная ссылка: "Динамический исходный код" в приложениях Java

person Kevin O'Donnell    schedule 30.12.2009
comment
В исходном вопросе указан внешний исходный код. В прошлый раз я проверял, что загрузчики классов не компилируют исходный код в байт-код. - person Kevin O'Donnell; 30.12.2009