Как предоставить интерфейс для JavaCompiler при динамической компиляции исходного файла?

Я пытаюсь скомпилировать и загрузить класс во время выполнения, не зная пакета класса. Я знаю, что класс должен соответствовать интерфейсу и расположению источника (и, следовательно, имени класса). Я пытаюсь сделать следующее:

/* 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 от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?

Класс Itest ошибка от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?

Класс Itest ошибка от компилятора. Как мне предоставить компилятору интерфейс (который уже был загружен), чтобы избежать этой ошибки?

[EDIT - RESOLVED]: Ошибка возникла из-за того, что интерфейс был ITest , а источник ссылался на интерфейс Itest .

8
задан brice 16 November 2017 в 12:46
поделиться

3 ответа

Похоже, что compiler.run() запускается извне и требует установки пути к классу. Пробовали ли вы передать ему подходящее значение пути класса, используя последний параметр args в вызове run()? Возможно, именно поэтому ToolProvider.getSystemToolClassLoader()

Это сообщение на stackoverflow также может помочь вам.

2
ответ дан 6 December 2019 в 01:39
поделиться

Думали ли вы о создании своего класса с помощью javassist или чего-то подобного?

-1
ответ дан 6 December 2019 в 01:39
поделиться

Не уверен, что это именно то, что вы ищете, но, как упомянул @Phil здесь , вы можете попытаться передать аргумент пути к классам в своем compiler.run метод.

1
ответ дан 6 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

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