Reflection Proxy - видимость из задачи загрузчика классов - PullRequest
1 голос
/ 15 апреля 2011

Я пытаюсь:
1) Загрузить интерфейс и класс реализации из заданного местоположения файла
2) Создайте объект Proxy с отражением, соответствующим интерфейсу, и направит все вызовы в класс реализации

Это позже используется для тестирования с использованием JUnit.

Проблема:
Тем не менее у меня возникают проблемы при попытке создать объект прокси. Я получаю исключение:

java.lang.IllegalArgumentException: interface Testing.Testable is not visible from class loader
...at Core.ProxyFactory.createProxy(ProxyFactory.java:26)

Рассматриваемая строка выглядит следующим образом:

Object obj = Proxy.newProxyInstance(implementationClass.getClassLoader(), new Class[]{interfaceClass}, forwarder);

Класс загружается правильно?
Я загружаю классы, которые мне нужны, используя URLClassLoader. Фрагмент этого выглядит следующим образом:

URL url = new File(path).toURI().toURL();
URL[] urlList = {url};
// Create loader and load
ClassLoader classLoader = new URLClassLoader(urlList);
Class loadedClass = classLoader.loadClass (classname);
return loadedClass;

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

Заранее благодарим за любую помощь, которую вы можете оказать

1 Ответ

3 голосов
/ 15 апреля 2011

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

Эту проблему можно решить, заменив использование URLClassLoader на:

ClassLoader classLoader = new URLClassLoader(urlList);
Class[] classes = new Class[classNames.length];
for (int i = 0; i<classNames.length; i++) {
  classes[i] = classLoader.loadClass(classNames[i]);
}

Это позволяет вам загружать несколько классов, используя один и тот же загрузчик классов, и, похоже, решает проблему!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...