Компиляция классов с помощью Toolprovider и загрузка их с помощью ClassLoader - PullRequest
1 голос
/ 25 августа 2011

Я пытаюсь загрузить классы, которые я генерирую компиляцией во время выполнения.Я могу без проблем скомпилировать их с помощью этого кода:

JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);

List<File> sourceFileList = new ArrayList<File>();
sourceFileList.add(new File(sourceFile));
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(sourceFileList);
CompilationTask task = compiler.getTask(null, fileManager, null, null,null, compilationUnits);

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

Class type = ClassLoader.getSystemClassLoader().loadClass(className);

или

ClassLoader loader = URLClassLoader.newInstance(new URL[] { myUrl }, getClass().getClassLoader());  //(URL?)

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

Ваша последняя попытка должна сработать. myUrl должен ссылаться на каталог (или Jar), ​​содержащий сгенерированный класс.

myUrl = new URL("file:///myGeneratedCode/");

URL должен заканчиваться "/", чтобы считаться каталогом, в противном случае он примет файл Jar.

0 голосов
/ 26 августа 2011

Я наконец нашел «проблему». Это была глупая ошибка с моей стороны: я пытался скомпилировать сгенерированный Java-файл перед его закрытием. Раздражает то, что JavaCompiler не выдавал никаких исключений.

После этого и создания класса у меня больше нет проблем с загрузкой ClassLoader

Еще раз спасибо.

...