В принципе, это не может работать для произвольных загрузчиков классов, поскольку они могут использовать любой способ, который можно себе представить, для фактической загрузки классов, и вообще не иметь никакой функции "прослушивания каталогов".
Загрузчик классов может даже генерироватьклассы (т.е. байт-код для классов) на лету, когда появляется loadClass
, и представьте себе TransableClassloader, где каждый такой автоматически определенный класс будет реализовывать ваш интерфейс - ваша программа никогда не закончится.
Этосказал, что для URLClassloader
вы можете использовать getURLs()
, а для jar:
и file:
URL вы можете использовать JarFile
или File
api, чтобы получить список имен файлов (и, следовательно, Classnames), чтобы попытаться,Поскольку у вас есть корень иерархии вашего пакета, указанный в URL-адресе, найти правильное имя пакета тоже не сложно.
(Если вам нужна дополнительная информация, произнесите это.)
Редактировать: Для имен пакетов они соответствуют именам каталогов внутри вашей иерархии.Итак, когда у вас есть базовый URL, который соответствует (скажем) dir/classes
, и вы нашли файл класса с именем dir/classes/com/company/gui/SimpleTranslator.class
, он соответствует классу com.company.gui.SimpleTranslator
.
Итак, удалите базовый префикс изаменить /
на .
(и вырезать из .class
).(В JarFile вам не нужно обрезать префикс.)
На самом деле, если вы используете рекурсивный метод для обхода вашей файловой иерархии, вы можете создать имя пакета с помощью того же метода, простодобавив строки (передайте их в качестве параметра для следующего рекурсивного вызова):
public void searchClassesInDir(File dir, String packagePrefix) {
if(dir.isDirectory()) {
String prefix = packagePrefix + dir.getName() + ".";
for(File f : dir.listFiles()) {
searchClasses(f, prefix);
}
}
else {
String fileName = dir.getName();
if(! fileName.endsWith(".class"))
return;
String className = packagePrefix + fileName.substring(0, fileName.length()-".class".length());
// now do the rest of your processing
}
}
searchClasses(new File(url.toURI()), "");