Сценарии Java: импортировать класс из внешнего файла - PullRequest
5 голосов
/ 22 июня 2010

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

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

или

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

это в скрипте для ScriptEngine Rhino
как я могу это сделать ???

Ответы [ 3 ]

5 голосов
/ 22 июня 2010

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

  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();
}

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

1 голос
/ 23 июня 2010

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

Решения, перечисленные здесь, будут работать.Проблема будет в том, что:

  1. У вас будет совместное решение с отражением, которое будет трудно устранить.Время выполнения?Везде, где я работал, нет.
0 голосов
/ 22 июня 2010

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

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

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

...