Как реализовать java.lang.Classloader getResources ()? - PullRequest
4 голосов
/ 28 марта 2012

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

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

теперь getResources() требует, чтобы я возвратил 'Enumeration' URL.

Я не понимаю, как создать Enumeration, как реализовать его hasMoreElements() и nextElement() внутри getResources().Я не могу увидеть связь между ними.

Не могу я просто найти подпуть из корня и вернуть абсолютный путь к ресурсу в виде URL?зачем создавать этот сложный Enumeration?

Спасибо, VImal

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Обычно два наиболее важных метода, которые вы должны переопределить в своем собственном загрузчике классов, это public Class findClass(String name) и public InputStream getResourceAsStream(String name). Другие могут быть делегированы родительскому загрузчику классов в большинстве случаев. Это означает, что у вас должна быть особая цель переопределения getResources(). Что это?

В любом случае вы можете легко добавить помещенный внутри регистратор, делегировать метод в родительский загрузчик классов и посмотреть, что запрашивается и возвращается родительским загрузчиком классов.

UPDATE

Если, согласно вашему комментарию, вы хотите загрузить классы / ресурсы из пути, сгенерированного во время выполнения , вы должны сделать следующее: когда путь передается в загрузчик классов (скажем, /home/user1/), он должен рекурсивно перечислять файлы, хранящие содержимое, в двух разных коллекциях - файлах классов и других файлах. Первая коллекция будет использоваться для загрузки классов, вторая - для ресурсов.

Для каждого файла в коллекции ресурсов вы определяете его путь к ресурсу в соответствии с http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource%28java.lang.String%29 и получаете URL из файла: URL url = file.toURI().toURL(); Эти пути и URL вы сохраняете как ключ-> значение где-то на карте и используете их в рассматриваемом методе.

Что касается пути к ресурсу, я считаю, что он должен быть несколько относительно пути, который был передан вашему загрузчику классов: /home/user1/img/logo.gif => /img/logo.gif

2 голосов
/ 28 марта 2012

Enumeration - это очень старый класс Java, который был заменен более новой библиотекой Коллекций. Вы можете получить его, создав Collection (из одного элемента) и затем вызвав Collections.enumeration() для него:

Enumeration<String> enumInstance = Collections.enumeration(Arrays.asList("Bla"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...