Сценарии Java: импортируйте класс из внешнего файла

Я хочу импортировать класс, который я уже пишу во внешней папке, например: Мой класс Example.java это расположено в c:\class\Example.java к моему сценарию как использование

var importedClass = new JavaImporter("c:\\class\\Example.java");

или

importClass("c:\\class\\Example.java");

это находится в сценарии для носорога ScriptEngine
как я могу сделать это???

5
задан Marouane Gazanayi 22 June 2010 в 13:58
поделиться

3 ответа

Я понимаю, что вы хотите:

  1. Скомпилировать исходный файл Java
  2. Загрузить скомпилированный код
  3. Использовать полученный класс в некотором JavaScript

javax Пакет .tools предоставляет механизм для компиляции кода, хотя, если вы не используете JDK, ToolProvider.getSystemJavaCompiler () вернет null , и вам придется полагаться на какой-то другой механизм компиляции (вызов внешнего компилятора; встраивание компилятора Eclipse и т. д.).

Байт-код Java (двоичные файлы .class ) может быть загружен во время выполнения через ClassLoader s.

Чтобы загруженные классы были видны вашему обработчику сценариев, вам необходимо предоставить их через конструктор ScriptEngineManager (ClassLoader) .


РЕДАКТИРОВАТЬ: на основе требований

public class HelloWorld {
  public void say() {
    System.out.println("Hello, World!");
  }
}

Этот сценарий просто вызывает API отражения Java для загрузки и создания экземпляра класса HelloWorld.class из каталога C: \ foo \ bin :

function classImport() {
  var location = new java.net.URL('file:/C:/foo/bin/');
  var urlArray = java.lang.reflect.Array.newInstance(java.net.URL, 1);
  urlArray[0] = location;
  var classLoader = new java.net.URLClassLoader(urlArray);
  return classLoader.loadClass("HelloWorld");
}

var myClass = classImport();

for(var i=0; i<10; i++) {
  myClass.getConstructor(null).newInstance(null).say();
}

Я уверен, что есть более элегантные способы сделать это.

5
ответ дан 14 December 2019 в 13:26
поделиться

Если я вас правильно понимаю, на самом деле вы пытаетесь загрузить классы Java, чтобы вы могли (предположительно) создавать экземпляры и т. Д. Термин для этого - динамическая загрузка, а не импорт.

Java позволяет динамически загружать файлы байт-кода ( *. Class ) с помощью метода ClassLoader.loadClass (String) . По этой теме есть много ресурсов; например страница « Загрузка класса » из учебного руководства по JNDI. Будьте готовы потратить некоторое время на обдумывание этой темы. В частности, поскольку вы пытаетесь загрузить класс, которого нет в обычном пути к классам вашего приложения, для этого вам потребуется создать новый загрузчик классов. Документация Javadocs для класса java.lang.ClassLoader находится здесь .

Исходный код Java нельзя загрузить напрямую, его необходимо сначала скомпилировать с помощью компилятора Java. Если вы используете современную установку JDK, можно вызвать компилятор Java во время выполнения. Но установка JRE не включает компилятор Java. Если ваша платформа имеет компилятор Java, доступный во время выполнения, вы можете получить к нему доступ через статический метод getSystemJavaCompiler () класса ToolProvider . И снова вызов компилятора Java из работающего приложения Java затруднен.

0
ответ дан 14 December 2019 в 13:26
поделиться

Я бы задался вопросом, зачем это делать.

Перечисленные здесь решения будут работать. Проблема будет заключаться в следующем:

  1. У вас будет собранное вместе решение с отражением, которое будет будет трудно устранить неполадки.
  2. Устраивает ли ваших клиентов исправления кода, который загружается во время выполнения? Все места, где я работал не устраивает.
1
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: