2010-04-27 3 views
1

Можно создать дубликат:
Can you find all classes in a package using reflection?Как узнать классы пакета в java?

Я полагаю имя пакета в виде строки:

String pkgName = "com.forat.web.servlets"; 

Как знать типы в этом пакете?

+5

Дубликат http: // stackoverf low.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection (или, по крайней мере, очень близко) – Jonik

ответ

3

Это невозможно в полном объеме. Если ваши классы хранятся в каталоге или файле JAR, вы можете посмотреть его содержимое, но механизм classloader настолько гибкий, что вопрос «какие классы находятся в этом пакете» просто не имеет смысла - можно написать загрузчик классов, который возвращает класс для любой имя класса, о котором вы просите.

+5

О, давай, это имеет смысл, даже невозможно всегда отвечать на вопрос. – doublep

1

Можете ли вы предоставить более подробную информацию, например, какую среду? Отдельное приложение, webapp на сервере приложений. Где загружаются классы? JAR, отдельные файлы в файловой системе, загрузчик сетевого класса и т. Д.

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

Наконец, вы хотите просто рассмотреть классы, загруженные в виртуальную машину или все классы, присутствующие в пути к классам?

EDIT: Смотрите также этот related question.

0

е у вас есть файл .jar что вы хотите получить файлы .class, вы можете использовать следующее:

  • java.util.jar.JarEntry

  • java.net.JarURLConnection создан с помощью java.​net.​URL.

  • URL-адрес в этом случае имя пакета в этом случае: com.forat.web.servlets

Пример

(Примечание: игнорирует обработка исключений)

// Get the "things" that are in the .jar 
Enumeration<JarEntry> jarEntries = 
    ((JarURLConnection)urlToJar.openConnection()).getJarFile().entries(); 
while(jarEntries.hasMoreElements()) 
{ 
    String entry = jarEntries.nextElement().getName(); 

    if (entry.endsWith(".class")) 
    { 
     // TODO: Remove "." from result. 
    // Here is the first of the classes in the .servlets location 
     Class.forName(entry); 
    } 
} 

Смежные вопросы