Я хочу импортировать класс, который я уже пишу во внешней папке, например: Мой класс Example.java
это расположено в c:\class\Example.java
к моему сценарию как использование
var importedClass = new JavaImporter("c:\\class\\Example.java");
или
importClass("c:\\class\\Example.java");
это находится в сценарии для носорога ScriptEngine
как я могу сделать это???
Я понимаю, что вы хотите:
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();
}
Я уверен, что есть более элегантные способы сделать это.
Если я вас правильно понимаю, на самом деле вы пытаетесь загрузить классы Java, чтобы вы могли (предположительно) создавать экземпляры и т. Д. Термин для этого - динамическая загрузка, а не импорт.
Java позволяет динамически загружать файлы байт-кода ( *. Class
) с помощью метода ClassLoader.loadClass (String)
. По этой теме есть много ресурсов; например страница « Загрузка класса » из учебного руководства по JNDI. Будьте готовы потратить некоторое время на обдумывание этой темы. В частности, поскольку вы пытаетесь загрузить класс, которого нет в обычном пути к классам вашего приложения, для этого вам потребуется создать новый загрузчик классов. Документация Javadocs для класса java.lang.ClassLoader
находится здесь .
Исходный код Java нельзя загрузить напрямую, его необходимо сначала скомпилировать с помощью компилятора Java. Если вы используете современную установку JDK, можно вызвать компилятор Java во время выполнения. Но установка JRE не включает компилятор Java. Если ваша платформа имеет компилятор Java, доступный во время выполнения, вы можете получить к нему доступ через статический метод getSystemJavaCompiler ()
класса ToolProvider
. И снова вызов компилятора Java из работающего приложения Java затруднен.
Я бы задался вопросом, зачем это делать.
Перечисленные здесь решения будут работать. Проблема будет заключаться в следующем: