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

StackOverflow https://stackoverflow.com/questions/1981750

Вопрос

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

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

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

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

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

Заранее благодарю тебя, Андреас :)

Это было полезно?

Решение

Вам нужен javax.tools API для этого.Таким образом, вам необходимо установить по крайней мере 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 в стандартном выводе, как это делается статическим инициализатором в исходном коде теста.Дальнейшее использование было бы более простым, если бы эти классы реализовывали определенный интерфейс, который уже есть в classpath .В противном случае вам необходимо задействовать API отражения для доступа к методам / полям и их вызова.

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top