Повышение является набором библиотек C++. 10 из которых включаются в tr1 C++ 0x.
Вы можете начинать с повышением здесь .
Брент - причина, по которой ассоциация является односторонней, связана с тем фактом, что любой класс любого компонента вашего CLASSPATH может объявить себя в любом пакете (кроме java / javax). Таким образом, нет отображения ВСЕХ классов в данном «пакете», потому что никто не знает и не может знать. Вы можете обновить файл jar завтра и удалить или добавить классы. Это все равно, что пытаться получить список всех людей по имени Джон / Джон / Йохан во всех странах мира - никто из нас не всеведущ, поэтому ни у кого из нас никогда не будет правильного ответа.
В те времена, когда апплеты были обычным явлением, можно было иметь URL-адрес в пути к классам. Когда загрузчику классов требовался класс, он выполнял поиск во всех местах пути к классам, включая ресурсы http. Поскольку в пути к классам могут быть такие вещи, как URL-адреса и каталоги, нет простого способа получить окончательный список классов.
Однако вы можете подойти довольно близко. Некоторые библиотеки Spring делают это сейчас. Вы можете получить все банки в пути к классам и открывать их как файлы. Затем вы можете взять этот список файлов и создать структуру данных, содержащую ваши классы.
Я реализовал его, и он работает в большинстве случаев. Поскольку он длинный, я помещаю его в файл здесь .
Идея состоит в том, чтобы найти местоположение исходного файла класса, который доступен в большинстве случаев (известным исключением являются файлы классов JVM - насколько я тестировал). Если код находится в каталоге, просканируйте все файлы и найдите только файлы классов. Если код находится в файле JAR, просканируйте все записи.
Этот метод можно использовать только в следующих случаях:
У вас есть класс, который находится в том же пакете, который вы хотите обнаружить. Этот класс называется SeedClass. Например, если вы хотите перечислить все классы в 'java.io', начальным классом может быть java.io.File
.
Ваши классы находятся в каталоге или в файле JAR, который он имеет информация об исходном файле (не файл исходного кода, а только исходный файл). Насколько я' Я пробовал, он работает почти на 100%, за исключением класса JVM (эти классы поставляются с JVM).
Ваша программа должна иметь разрешение на доступ к ProtectionDomain этих классов. Если ваша программа загружена локально, проблем быть не должно.
Я тестировал программу только для регулярного использования, поэтому проблема все еще может быть.
Надеюсь, это поможет.
Насколько мне известно, эта функция все еще подозрительно отсутствует в API отражения Java. Вы можете получить объект пакета, просто сделав следующее:
Package packageObj = Package.getPackage("my.package");
Но, как вы, вероятно, заметили, это не позволит вам перечислить классы в этом пакете. На данный момент вы должны использовать подход, более ориентированный на файловую систему.
Я нашел несколько примеров реализации в этом сообщении
Я не уверен на 100%, что эти методы будут работать, когда ваши классы похоронены в файлах JAR, но я надеюсь, что один из них сделает это за вас.
Я согласен с @skaffman ... если у вас есть другой способ сделать это, я бы рекомендовал сделать это вместо этого.