2010-06-22 6 views
5

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

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

или

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

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

+1

Любые причины, по которым вы не можете использовать classpath? –

+0

Вы хотите импортировать Java-класс в JavaScript, который будет запущен с использованием Rhino? Или вы хотите импортировать класс JavaScript в Java с помощью Rhino? –

+0

Я хочу импортировать класс Java в файл JavaScript, который будет запускаться с использованием Rhino :) это он –

ответ

5

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

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

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

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

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


EDIT: на основе требований

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

Этот скрипт просто вызывает отражение Java API, чтобы загрузить и создать экземпляр класса 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(); 
} 

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

+0

Представьте, что у меня есть приложение и что я не хочу меняться, все, что я могу изменить, это файл сценария, который загружен в приложение. Итак, если я хочу что-то сделать, я не могу сделать это в коде Java приложения, но только в файле сценария, поэтому я хочу импортировать класс, который является внешним по отношению к моему проекту, который компилируется и находится в мой жесткий диск. Надеюсь, что я больше explicatif: s thnx много –

0

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

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

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

+0

Thnx для ответа, Что я хочу сделать, это добавить класс, например, MyClass.java, что я скомпилированный в MyClass.class , поэтому я хотел бы импортировать MyClass, который находится на моем жестком диске, а не в пакеты моего проекта, и это внутри файла сценария: например: importClass ("D: \\ SVN_KC \\ \\ \\ KP скрипты ствол \\ Протос \\ ScriptEngine \\ Exemple.class "); –

1

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

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

  1. Вы будете иметь починилась решение с отражением, что будет быть трудно устранить.
  2. Ваши клиенты Хорошо с исправления, которые загружаются по адресу Runtime? Каждое место я работал в нет.
+0

Дело в том, чтобы разрешить клиентам изменять файлы сценариев, не касаясь приложения. Я думаю, что использование интроспекции, как было сказано в файле сценария, будет работать thnx много –