#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
объекте (если менеджер безопасности разрешает это).