Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Список классов пакета


Автор: last 4.7.2006, 10:37
Вот такая проблема, 

есть название пакета(package) , строка скажем,  требуется получить список классов пакета, причем и видимых снаружи пакета (public то есть) так и доступных только в пакете.

Пакет есть в нашем classpath , разумеется.

Если, напимер, есть имя класса, то можно с помощью reflection получить его поля, методы, конструкторы и пр. это я знаю как делать, а вот как с  package --- ума не приложу  smile .
 

Автор: redrick 4.7.2006, 13:42
поищи по этому разделу и еще по j2me - помню это обсуждалось 

Автор: Bulat 4.7.2006, 19:06
Цитата(last @  4.7.2006,  10:37 Найти цитируемый пост)
а вот как с  package --- ума не приложу  
 
.....Млин за секунду из головы вылетело smile  

ладно как вспомню отпишу......... smile 
  

Автор: djGri 5.7.2006, 09:35
Вот нашел кое-что http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/com/sun/javadoc/PackageDoc.html 

Автор: last 5.7.2006, 12:04
Цитата(djGri @ 5.7.2006,  09:35)
Вот нашел кое-что http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/com/sun/javadoc/PackageDoc.html


Не то это, это апи для JavaDoc, про то как доклеты свои для генерации писать.  Как это можно применить в этом случае, незнаю.

Кстати, про JavaDoc. Если он есть для данного пакета, то список классов можно получить путем анализа листинга директории с JavaDoc этого package (ls -l /java/util  и тд). Такой вот обходной путь  smile , но   понятно неприемлимый. JavaDoc просто может не быть, например.

Уверен, что проще способ должен быть. Браузеры классов в IDE показывают список классов для пакета без всякого JavaDoc. Вот только как?


 

Автор: djGri 5.7.2006, 13:26
А если так
Код

packageName = packageName.replace(".", File.separatorChar + "");  
File myDir = new File(packageName);
String[] filesInPackage = myDir.list();
 

Автор: last 5.7.2006, 14:08
Т.е,  как я понимаю предлагается следующее:

берутся  все *.class  из classpath, из директорий и jar (jar тоже можно рассматривать как запакованное дерево каталогов) и анализирутся пути до корня и имена файлов.

находим в classpath package.jar, к примеру, со следующей структурой

+-
   |
    +com
            |
             +mysite
                         |
                          Super.class

находим рекурсивным перебором Super.class, а путь до него --- будет имя пакета, имеем
com.mysite.Super , запоминаем и так далее

после перебора у нас будет дерево классов, распределенных по пакетам.

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

Видимо по другому нельзя. Или  можно?
 

Автор: Bulat 6.7.2006, 11:44
djGri, млин, пока освободился опередил. smile 

last, если узнаешь другой способ попроще, дашь знать. smile  

Автор: LSD 6.7.2006, 21:59
Однозначного решения проблема не имеет. Т.к. классы могут быть в нескольких jar-ах, могут лежать россыпью в папках, могут загружаться по сети (для апплетов например), могут загружаться из базы данных (например Oracle-овский загрузчик классов), плюс комбинация всего вышеперечисленного. 

Автор: djGri 7.7.2006, 12:51
Для решения этой задачи, пока не существует APIs.
Есть несколько решений, но все они похожие на мое smile
Вот тут http://forum.java.sun.com/thread.jspa?threadID=341935&tstart=0  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)