2016-03-01 4 views
1

У меня есть файл jar, и я могу перечислить все классы в банке. Классы в банке могут быть общедоступными, защищены или обладать пакетом. Интересно, можно ли рассказать о масштабах и перечислить только общедоступные классы?Список всех открытых классов в банке программно

+1

уверен, что это возможно. Например, вы можете загрузить классы с https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html и использовать отражение, чтобы иметь модификаторы https://docs.oracle.com /javase/7/docs/api/java/lang/Class.html#getModifiers(). У вас уже есть код? – superbob

+0

Классы имеют только области _public_ и _package_. –

+0

@ Классы AndriyKryvtsun могут иметь защищенную область: 'public class Foo {protected static class Bar {} protected class Buzz {}}' В чем проблема с тем, что они также могут иметь закрытую область: 'public class Foo {private static class Bar {} частный класс Buzz {}} '. –

ответ

1

Вы можете сделать это, и я могу думать о более чем только один способ, как это сделать, вот два:

  • Вы можете использовать инструмент манипулирования байткодом читать .class файлы и получить модификатор. Недостатком является то, что для этого вам нужна дополнительная библиотека. Поверхность заключается в том, что этот способ был бы вполне безопасным, так как вам не нужно загружать класс в виртуальную машину только в память, поэтому никакой код не выполняется, и если классы .jar зависят от классов, которые недоступны, все еще работают.

  • Вы можете использовать ClassLoader с этим .jar и загрузить каждый из классов, а затем проверить его с помощью Reflection. Положительным моментом является то, что для этого вам не нужны никакие сторонние библиотеки. Недостатком является то, что для проверки классов они должны быть загружены ClassLoader, что означает, что будет выполняться код этих классов (статические инициализаторы). Если это ненадежный сторонний код, вы сначала захотите установить SecurityManager в песочницу этих классов. Другой недостаток заключается в том, что если эти классы зависят от других классов, которые недоступны (например, путем расширения таких недоступных классов), этот подход потерпит неудачу.

0

Если вы уже список классов в банке, вы можете использовать интерфейс Reflection, чтобы получить объекты класса для этих классов по имени (String), а затем использовать интерфейс класса для определения свойств класс, например isPublic, isFinal или isStatic.

Быстрый поиск показывает:

http://tutorials.jenkov.com/java-reflection/classes.html#modifiers

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