Получение имен всех классов Java, объявленных в пакете - PullRequest
6 голосов
/ 13 ноября 2010

Я пишу функциональность, в которой было бы полезно поместить классы в определенный пакет моей программы. Кроме того, я хочу только классы, которые подкласса определенного класса.

Мне нужны классы для вызова статических методов для них.

Есть ли автоматический способ сделать это? Если это так, это медленно?

На случай, если мне неясно, что я хочу, это что-то вроде этого:

ArrayList<Class<? extends MySuperClass>> classes = ;

classes.add(MyClass.class); 
classes.add(MyClass2.class); 

Вместо того, чтобы вызывать add для каждого класса, я хотел бы автоматически получить этот список классов.

Количество классов невелико, поэтому я не против объявить их вручную, если автоматический трюк будет медленным - это приложение для мобильной платформы.

В любом случае, я также хотел бы знать, как вызывать статический метод для каждого метода в ArrayList:

  // error The method nameOfStaticMethod is undefined for the type Class<capture#2-of ? extends MySuperClass>
  classes.get(0).nameOfStaticMethod (); 

Спасибо за ваши комментарии.

Ответы [ 2 ]

2 голосов
/ 13 ноября 2010

Java не предоставляет эту возможность.На уровне пакета нет самоанализа.Классы могут быть записями в базе данных или на другой стороне сетевого соединения.Нет необходимости хранить и организовывать их, чтобы упростить их перечисление по пакетам.

Вы можете создать собственный загрузчик классов и API для предоставления метода перечисления имен классов.

1 голос
/ 13 ноября 2010

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

  • Как предложил JOTN - нужен доступ к файлу - нет, если это jar
  • Список записей JAR - ну, также нужен файл jar

Цитата старше ТАК вопрос:

Невозможно запросить пакет для его классов (или даже его подпакетов). http://forums.sun.com/thread.jspa?threadID=341935&start=0&tstart=0 содержит очень хорошую дискуссию о том, почему это проблематично, а также несколько решений вашей проблемы.

В любом случае, вот как вы вызываете статические методы для класса:

Method m = Integer.class.getMethod("toString", Integer.TYPE);
System.out.println(m.invoke(null, 123));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...