Intereting Posts

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

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

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

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

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

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

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

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

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

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

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

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