Моя путаница: отражение в Java - PullRequest
1 голос
/ 01 мая 2011

Я только что закончил читать главу «Мышление в Java», касающуюся информации о типах и рефлексии. Хотя instanceof кажется мне вполне естественным, некоторые примеры размышлений привели меня в замешательство. Я хочу знать, широко ли отражение используется в проектах Java? Каковы «хорошие части» отражения? Можете ли вы предложить какие-нибудь интересные лекции о рефлексии и типе информации с более хорошими и достойными примерами?

Редактировать (еще один вопрос):

Почему полезно обращаться к закрытым методам и полям с помощью java.lang.reflect.Method.setAccesible()?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 01 мая 2011

если бы вы могли опубликовать некоторые примеры, я был бы рад объяснить это для вас. Отражение широко используется с фреймворками, которые должны извлекать мета-информацию о работающем объекте (например, фреймворки, которые зависят от аннотаций или полей в ваших объектах, подумайте о Hibernate, Spring и многих других). На более высоком уровне я иногда использую отражение, чтобы обеспечить общую функциональность (например, для кодирования каждой строки в объекте, эмуляции Duck Typing и тому подобного). Я знаю, что вы уже читали книгу, в которой рассматриваются основы рефлексии, но мне нужно указать официальное руководство Sun (эм. Oracle) как обязательное: http://download.oracle.com/javase/tutorial/reflect/

2 голосов
/ 01 мая 2011

Один хороший пример, на мой взгляд, - создание объектов на основе имен классов, которые известны только во время выполнения, например, содержащихся в файле конфигурации.Вам все равно нужно будет знать общий интерфейс с классами, которые вы создаете динамически, поэтому у вас есть что-то, что тоже может их привести.Но это позволяет приводу конфигурации, какая реализация будет использоваться.

0 голосов
/ 05 января 2016

Причиной предоставления таких функций в Reflection является множество ситуаций, когда инструменту / приложению требуется метаинформация о классе, переменных, методах. Например: -

  1. Среды IDE, использующие функцию автозаполнения для получения имен методов и имен атрибутов.
  2. Веб-контейнер Tomcat для пересылки запроса в корректный модуль путем анализа их файлов web.xml и запроса URI.
  3. JUnit использует отражение для перечисления всех методов в классе; предполагая, что именованные методы testXXX называются методами тестирования или методами, помеченными @ Test.

Чтобы прочитать полный текст статьи о размышлении, вы можете проверить http://modernpathshala.com/Forum/Thread/Interview/308/give-some-examples-where-reflection-is-used

0 голосов
/ 01 мая 2011

Другим примером может быть случай, когда вам нужно привести объект к классу, который является его потомком. Если вы не уверены в типе этого объекта, вы можете использовать instanceof, чтобы убедиться, что приведение будет правильным во время выполнения, избегая исключения приведения класса.

Пример:

public void actionPerformed (ActionEvent e){
    Object obj = e.getSource();

    if (obj instanceof objType)
    objType t = (objType) obj;   // you can check the type using instanceof if you are not sure about obj class at runtime
}
...