Я пытаюсь скомпилировать и загрузить класс во время выполнения, не зная пакета класса. Я знаю, что класс должен соответствовать интерфейсу и расположению источника (и, следовательно, имени класса). Я пытаюсь сделать следующее:
/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
где файл Test.java выглядит примерно так
import foo.Itest;
public class Test implements Itest{
...
}
И Я получаю не могу найти ошибку символа символа: class Itest
от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?
/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
где файл Test.java выглядит примерно как
import foo.Itest;
public class Test implements Itest{
...
}
, и я получаю не могу найти символ символа: ошибка класса Itest
от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?
/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
где файл Test.java выглядит примерно как
import foo.Itest;
public class Test implements Itest{
...
}
, и я получаю не могу найти символ символа: ошибка класса Itest
от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?
[EDIT - RESOLVED]: Ошибка возникла из-за того, что интерфейс был ITest
, а источник ссылался на интерфейс Itest
.
Похоже, что compiler.run()
запускается извне и требует установки пути к классу. Пробовали ли вы передать ему подходящее значение пути класса, используя последний параметр args
в вызове run()
? Возможно, именно поэтому ToolProvider.getSystemToolClassLoader()
Это сообщение на stackoverflow также может помочь вам.
Думали ли вы о создании своего класса с помощью javassist или чего-то подобного?
Не уверен, что это именно то, что вы ищете, но, как упомянул @Phil здесь , вы можете попытаться передать аргумент пути к классам в своем compiler.run
метод.