Java отражение — методы самоанализа

#java #reflection

#java #отражение

Вопрос:

 Method[] theMethods = myClass.getMethods();
for( Method m : theMethods ){
...

}
  

Будет ли массив включать в себя все методы класса? общедоступные, частные, защищенные и все унаследованные?
Буду ли я иметь доступ ко всем из них, в основном к частным и защищенным?

Если нет, то как я могу получить все методы класса, а также иметь доступ ко всем?

Комментарии:

1. -1 за вопрос, на который можно ответить, прочитав javadoc

Ответ №1:

Javadoc делает это довольно ясным:

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

Чтобы получить доступ к непубличным методам, используйте getDeclaredMethods .

Ответ №2:

Чтобы получить все методы класса, вам нужно рекурсивно вызвать getDeclaredMethods() для класса и всех его суперклассов. В зависимости от того, чего вы хотите достичь с его помощью, вам может потребоваться удалить дубликаты, которые могут возникнуть из-за перегрузки метода.

Комментарии:

1. Итак, GetMethods() getDeclaredMethods() — объявленные общедоступные методы в calss = все методы класса?

2. getMethods() getDeclaredMethods() предоставляет вам все общедоступные методы и private protected, которые реализованы непосредственно в классе, но не частные и защищенные методы, относящиеся к его суперклассам.

Ответ №3:

Из документа по API:

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

Таким образом, он предоставляет вам только общедоступные методы. Чтобы получить все методы, вы должны использовать getDeclaredMethods() для класса и всех его суперклассов (через getSuperclass() ).

Для вызова непубличных методов вы можете использовать setAccessible(true) на Method объекте (если менеджер безопасности разрешает это).