Про Reflect API доступным языком. Определение интерфейсов, реализуемых классом

13.05.2019

Поисковая система Google (www.google.com) предоставляет множество возможностей для поиска. Все эти возможности – неоценимый инструмент поиска для пользователя впервые попавшего в Интернет и в то же время еще более мощное оружие вторжения и разрушения в руках людей с злыми намерениями, включая не только хакеров, но и некомпьютерных преступников и даже террористов.
(9475 просмотров за 1 неделю)

Денис Батранков
denisNOSPAMixi.ru

Внимание: Эта статья не руководство к действию. Эта статья написана для Вас, администраторы WEB серверов, чтобы у Вас пропало ложное ощущение, что Вы в безопасности, и Вы, наконец, поняли коварность этого метода получения информации и взялись за защиту своего сайта.

Введение

Я, например, за 0.14 секунд нашел 1670 страниц!

2. Введем другую строку, например:

inurl:"auth_user_file.txt"

немного меньше, но этого уже достаточно для свободного скачивания и для подбора паролей (при помощи того же John The Ripper). Ниже я приведу еще ряд примеров.

Итак, Вам надо осознать, что поисковая машина Google посетила большинство из сайтов Интернет и сохранила в кэше информацию, содержащуюся на них. Эта кэшированная информация позволяет получить информацию о сайте и о содержимом сайта без прямого подключения к сайту, лишь копаясь в той информации, которая хранится внутри Google. Причем, если информация на сайте уже недоступна, то информация в кэше еще, возможно, сохранилась. Все что нужно для этого метода: знать некоторые ключевые слова Google. Этот технический прием называется Google Hacking.

Впервые информация о Google Hacking появилась на рассылке Bugtruck еще 3 года назад. В 2001 году эта тема была поднята одним французским студентом. Вот ссылка на это письмо http://www.cotse.com/mailing-lists/bugtraq/2001/Nov/0129.html . В нем приведены первые примеры таких запросов:

1) Index of /admin
2) Index of /password
3) Index of /mail
4) Index of / +banques +filetype:xls (for france...)
5) Index of / +passwd
6) Index of / password.txt

Нашумела эта тема в англо-читающей части Интернета совершенно недавно: после статьи Johnny Long вышедшей 7 мая 2004 года. Для более полного изучения Google Hacking советую зайти на сайт этого автора http://johnny.ihackstuff.com . В этой статье я лишь хочу ввести вас в курс дела.

Кем это может быть использовано:
- Журналисты, шпионы и все те люди, кто любит совать нос не в свои дела, могут использовать это для поиска компромата.
- Хакеры, разыскивающие подходящие цели для взлома.

Как работает Google.

Для продолжения разговора напомню некоторые из ключевых слов, используемых в запросах Google.

Поиск при помощи знака +

Google исключает из поиска неважные, по его мнению, слова. Например вопросительные слова, предлоги и артикли в английском языке: например are, of, where. В русском языке Google, похоже, все слова считает важными. Если слово исключается из поиска, то Google пишет об этом. Чтобы Google начал искать страницы с этими словами перед ними нужно добавить знак + без пробела перед словом. Например:

ace +of base

Поиск при помощи знака –

Если Google находит большое количество станиц, из которых необходимо исключить страницы с определенной тематикой, то можно заставить Google искать только страницы, на которых нет определенных слов. Для этого надо указать эти слова, поставив перед каждым знак – без пробела перед словом. Например:

рыбалка -водка

Поиск при помощи знака ~

Возможно, что вы захотите найти не только указанное слово, но также и его синонимы. Для этого перед словом укажите символ ~.

Поиск точной фразы при помощи двойных кавычек

Google ищет на каждой странице все вхождения слов, которые вы написали в строке запроса, причем ему неважно взаимное расположение слов, главное чтобы все указанные слова были на странице одновременно (это действие по умолчанию). Чтобы найти точную фразу – ее нужно взять в кавычки. Например:

"подставка для книг"

Чтобы было хоть одно из указанных слов нужно указать логическую операцию явно: OR. Например:

книга безопасность OR защита

Кроме того в строке поиска можно использовать знак * для обозначения любого слова и. для обозначения любого символа.

Поиск слов при помощи дополнительных операторов

Существуют поисковые операторы, которые указываются в строке поиска в формате:

operator:search_term

Пробелы рядом с двоеточием не нужны. Если вы вставите пробел после двоеточия, то увидите сообщение об ошибке, а перед ним, то Google будет использовать их как обычную строку для поиска.
Существуют группы дополнительных операторов поиска: языки - указывают на каком языке вы хотите увидеть результат, дата - ограничивают результаты за прошедшие три, шесть или 12 месяцев, вхождения - указывают в каком месте документа нужно искать строку: везде, в заголовке, в URL, домены - производить поиск по указанному сайту или наоборот исключить его из поиска, безопасный поиск - блокируют сайты содержащие указанный тип информации и удаляют их со страниц результатов поиска.
При этом некоторые операторы не нуждаются в дополнительном параметре, например запрос "cache:www.google.com " может быть вызван, как полноценная строка для поиска, а некоторые ключевые слова, наоборот, требуют наличия слова для поиска, например " site:www.google.com help ". В свете нашей тематики посмотрим на следующие операторы:

Оператор

Описание

Требует дополнительного параметра?

поиск только по указанному в search_term сайту

поиск только в документах с типом search_term

найти страницы, содержащие search_term в заголовке

найти страницы, содержащие все слова search_term в заголовке

найти страницы, содержащие слово search_term в своем адресе

найти страницы, содержащие все слова search_term в своем адресе

Оператор site: ограничивает поиск только по указанному сайту, причем можно указать не только доменное имя, но и IP адрес. Например, введите:

Оператор filetype: ограничивает поиск в файлах определенного типа. Например:

На дату выхода статьи Googlе может искать внутри 13 различных форматов файлов:

  • Adobe Portable Document Format (pdf)
  • Adobe PostScript (ps)
  • Lotus 1-2-3 (wk1, wk2, wk3, wk4, wk5, wki, wks, wku)
  • Lotus WordPro (lwp)
  • MacWrite (mw)
  • Microsoft Excel (xls)
  • Microsoft PowerPoint (ppt)
  • Microsoft Word (doc)
  • Microsoft Works (wks, wps, wdb)
  • Microsoft Write (wri)
  • Rich Text Format (rtf)
  • Shockwave Flash (swf)
  • Text (ans, txt)

Оператор link: показывает все страницы, которые указывают на указанную страницу.
Наверно всегда интересно посмотреть, как много мест в Интернете знают о тебе. Пробуем:

Оператор cache: показывает версию сайта в кеше Google, как она выглядела, когда Google последний раз посещал эту страницу. Берем любой, часто меняющийся сайт и смотрим:

Оператор intitle: ищет указанное слово в заголовке страницы. Оператор allintitle: является расширением – он ищет все указанные несколько слов в заголовке страницы. Сравните:

intitle:полет на марс
intitle:полет intitle:на intitle:марс
allintitle:полет на марс

Оператор inurl: заставляет Google показать все страницы содержащие в URL указанную строку. Оператор allinurl: ищет все слова в URL. Например:

allinurl:acid acid_stat_alerts.php

Эта команда особенно полезна для тех, у кого нет SNORT – хоть смогут посмотреть, как он работает на реальной системе.

Методы взлома при помощи Google

Итак, мы выяснили что, используя комбинацию вышеперечисленных операторов и ключевых слов, любой человек может заняться сбором нужной информации и поиском уязвимостей. Эти технические приемы часто называют Google Hacking.

Карта сайта

Можно использовать оператор site: для просмотра всех ссылок, которые Google нашел на сайте. Обычно страницы, которые динамически создаются скриптами, при помощи параметров не индексируются, поэтому некоторые сайты используют ISAPI фильтры, чтобы ссылки были не в виде /article.asp?num=10&dst=5 , а со слешами /article/abc/num/10/dst/5 . Это сделано для того, чтобы сайт вообще индексировался поисковиками.

Попробуем:

site:www.whitehouse.gov whitehouse

Google думает, что каждая страница сайта содержит слово whitehouse. Этим мы и пользуемся, чтобы получить все страницы.
Есть и упрощенный вариант:

site:whitehouse.gov

И что самое приятное - товарищи с whitehouse.gov даже не узнали, что мы посмотрели на структуру их сайта и даже заглянули в кэшированные странички, которые скачал себе Google. Это может быть использовано для изучения структуры сайтов и просмотра содержимого, оставаясь незамеченным до поры до времени.

Просмотр списка файлов в директориях

WEB серверы могут показывать списки директорий сервера вместо обычных HTML страниц. Обычно это делается для того, чтобы пользователи выбирали и скачивали определенные файлы. Однако во многих случаях у администраторов нет цели показать содержимое директории. Это возникает вследствие неправильной конфигурации сервера или отсутствия главной страницы в директории. В результате у хакера появляется шанс найти что-нибудь интересное в директории и воспользоваться этим для своих целей. Чтобы найти все такие страницы, достаточно заметить, что все они содержат в своем заголовке слова: index of. Но поскольку слова index of содержат не только такие страницы, то нужно уточнить запрос и учесть ключевые слова на самой странице, поэтому нам подойдут запросы вида:

intitle:index.of parent directory
intitle:index.of name size

Поскольку в основном листинги директорий сделаны намеренно, то вам, возможно, трудно будет найти ошибочно выведенные листинги с первого раза. Но, по крайней мере, вы уже сможете использовать листинги для определения версии WEB сервера, как описано ниже.

Получение версии WEB сервера.

Знание версии WEB сервера всегда полезно перед началом любой атака хакера. Опять же благодаря Google можно получить эту информацию без подключения к серверу. Если внимательно посмотреть на листинг директории, то можно увидеть, что там выводится имя WEB сервера и его версия.

Apache1.3.29 - ProXad Server at trf296.free.fr Port 80

Опытный администратор может подменить эту информацию, но, как правило, она соответствует истине. Таким образом, чтобы получить эту информацию достаточно послать запрос:

intitle:index.of server.at

Чтобы получить информацию для конкретного сервера уточняем запрос:

intitle:index.of server.at site:ibm.com

Или наоборот ищем сервера работающие на определенной версии сервера:

intitle:index.of Apache/2.0.40 Server at

Эта техника может быть использована хакером для поиска жертвы. Если у него, к примеру, есть эксплойт для определенной версии WEB сервера, то он может найти его и попробовать имеющийся эксплойт.

Также можно получить версию сервера, просматривая страницы, которые по умолчанию устанавливаются при установке свежей версии WEB сервера. Например, чтобы увидеть тестовую страницу Apache 1.2.6 достаточно набрать

intitle:Test.Page.for.Apache it.worked!

Мало того, некоторые операционные системы при установке сразу ставят и запускают WEB сервер. При этом некоторые пользователи даже об этом не подозревают. Естественно если вы увидите, что кто-то не удалил страницу по умолчанию, то логично предположить, что компьютер вообще не подвергался какой-либо настройке и, вероятно, уязвим для атак.

Попробуйте найти страницы IIS 5.0

allintitle:Welcome to Windows 2000 Internet Services

В случае с IIS можно определить не только версию сервера, но и версию Windows и Service Pack.

Еще одним способом определения версии WEB сервера является поиск руководств (страниц подсказок) и примеров, которые могут быть установлены на сайте по умолчанию. Хакеры нашли достаточно много способов использовать эти компоненты, чтобы получить привилегированный доступ к сайту. Именно поэтому нужно на боевом сайте удалить эти компоненты. Не говоря уже о том, что по наличию этих компонентов можно получить информацию о типе сервера и его версии. Например, найдем руководство по apache:

inurl:manual apache directives modules

Использование Google как CGI сканера.

CGI сканер или WEB сканер – утилита для поиска уязвимых скриптов и программ на сервере жертвы. Эти утилиты должны знать что искать, для этого у них есть целый список уязвимых файлов, например:

/cgi-bin/cgiemail/uargg.txt
/random_banner/index.cgi
/random_banner/index.cgi
/cgi-bin/mailview.cgi
/cgi-bin/maillist.cgi
/cgi-bin/userreg.cgi

/iissamples/ISSamples/SQLQHit.asp
/SiteServer/admin/findvserver.asp
/scripts/cphost.dll
/cgi-bin/finger.cgi

Мы может найти каждый из этих файлов с помощью Google, используя дополнительно с именем файла в строке поиска слова index of или inurl: мы можем найти сайты с уязвимыми скриптами, например:

allinurl:/random_banner/index.cgi

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

Как защитить себя от взлома через Google.

1. Не выкладывайте важные данные на WEB сервер.

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

2. Проверьте свой сайт.

Используйте описанные методы, для исследования своего сайта. Проверяйте периодически свой сайт новыми методами, которые появляются на сайте http://johnny.ihackstuff.com . Помните, что если вы хотите автоматизировать свои действия, то нужно получить специальное разрешение от Google. Если внимательно прочитать http://www.google.com/terms_of_service.html , то вы увидите фразу: You may not send automated queries of any sort to Google"s system without express permission in advance from Google.

3. Возможно, вам не нужно чтобы Google индексировал ваш сайт или его часть.

Google позволяет удалить ссылку на свой сайт или его часть из своей базы, а также удалить страницы из кэша. Кроме того вы можете запретить поиск изображений на вашем сайте, запретить показывать короткие фрагменты страниц в результатах поиска Все возможности по удалению сайта описаны на сранице http://www.google.com/remove.html . Для этого вы должны подтвердить, что вы действительно владелец этого сайта или вставить на страницу теги или

4. Используйте robots.txt

Известно, что поисковые машины заглядывают в файл robots.txt лежащий в корне сайта и не индексируют те части, которые помечены словом Disallow . Вы можете воспользоваться этим, для того чтобы часть сайта не индексировалась. Например, чтобы не индексировался весь сайт, создайте файл robots.txt содержащий две строчки:

User-agent: *
Disallow: /

Что еще бывает

Чтобы жизнь вам медом не казалась, скажу напоследок, что существуют сайты, которые следят за теми людьми, которые, используя вышеизложенные выше методы, разыскивают дыры в скриптах и WEB серверах. Примером такой страницы является

Приложение.

Немного сладкого. Попробуйте сами что-нибудь из следующего списка:

1. #mysql dump filetype:sql - поиск дампов баз данных mySQL
2. Host Vulnerability Summary Report - покажет вам какие уязвимости нашли другие люди
3. phpMyAdmin running on inurl:main.php - это заставит закрыть управление через панель phpmyadmin
4. not for distribution confidential
5. Request Details Control Tree Server Variables
6. Running in Child mode
7. This report was generated by WebLog
8. intitle:index.of cgiirc.config
9. filetype:conf inurl:firewall -intitle:cvs – может кому нужны кофигурационные файлы файрволов? :)
10. intitle:index.of finances.xls – мда....
11. intitle:Index of dbconvert.exe chats – логи icq чата
12. intext:Tobias Oetiker traffic analysis
13. intitle:Usage Statistics for Generated by Webalizer
14. intitle:statistics of advanced web statistics
15. intitle:index.of ws_ftp.ini – конфиг ws ftp
16. inurl:ipsec.secrets holds shared secrets – секретный ключ – хорошая находка
17. inurl:main.php Welcome to phpMyAdmin
18. inurl:server-info Apache Server Information
19. site:edu admin grades
20. ORA-00921: unexpected end of SQL command – получаем пути
21. intitle:index.of trillian.ini
22. intitle:Index of pwd.db
23. intitle:index.of people.lst
24. intitle:index.of master.passwd
25. inurl:passlist.txt
26. intitle:Index of .mysql_history
27. intitle:index of intext:globals.inc
28. intitle:index.of administrators.pwd
29. intitle:Index.of etc shadow
30. intitle:index.of secring.pgp
31. inurl:config.php dbuname dbpass
32. inurl:perform filetype:ini

  • "Hacking mit Google"
  • Учебный центр "Информзащита" http://www.itsecurity.ru - ведущий специализированный центр в области обучения информационной безопасности (Лицензия Московского Комитета образования № 015470, Государственная аккредитация № 004251). Единственный авторизованный учебный центр компаний Internet Security Systems и Clearswift на территории России и стран СНГ. Авторизованный учебный центр компании Microsoft (специализация Security). Программы обучения согласованы с Гостехкомиссией России, ФСБ (ФАПСИ). Свидетельства об обучении и государственные документы о повышении квалификации.

    Компания SoftKey – это уникальный сервис для покупателей, разработчиков, дилеров и аффилиат–партнеров. Кроме того, это один из лучших Интернет-магазинов ПО в России, Украине, Казахстане, который предлагает покупателям широкий ассортимент, множество способов оплаты, оперативную (часто мгновенную) обработку заказа, отслеживание процесса выполнения заказа в персональном разделе, различные скидки от магазина и производителей ПО.

    Macrium Reflect Free - простая бесплатная утилита для бэкапа и создания Image-копий жесткого диска. Бесплатно скачать Macrium Reflect Free Edition последней версии для Windows 30-дневную пробную версию. Постоянная ссылка: сайт/ru/backups/macriumreflect

    Эта утилита служит для создания и использования резервных данных жесткого диска на операционной системе Microsoft Windows. Для работы нужно скачать Macrium Reflect Free Edition RUS бесплатно для Windows 10, 8..

    Краткое описание Macrium Reflect Free

    Процедуру копирования в резерв называют по-разному: и бикап, и букап, и бэкап и даже быкап, но процесс является примитивным резервированием данных. С задачей резервного копирования может справиться множество программ, как распространяемых за деньги, так и бесплатных, и Макриум Рефлект Фрее - одна из таких.

    Юзабилити, интерфейс, функциональные возможности

    Использование очень удобно, не требует особого внимания от пользователя, может быть, поэтому не случайна высокая оценка программы по юзабильности. Не русский интерфейс Macrium Reflect Free интуитивно понятен, но если возникли вопросы по работе с утилитой, можно скачать видео уроки с торрентов (torrent) или посетить официальный сайт.

    Функции программы резервного копирования MRF:

    Программа создает копию диска, используя сервис теневых копий Microsoft.
    - Хранить резервные копии дисков можно на DVD-накопителях, USB, а также на сетевых устройствах и FireWire.
    - Макриум Рефлект Фри Эдишн оснащен встроенным менеджером планирования для создания в автоматическом режиме копий.
    - Высокая скорость и серьезные степени сжатия копируемого диска.
    - Установлены плагины для восстановления диска при помощи BartPE Rescue.
    - Настройка системного журнала в HTML-формате.
    - Так же можно создать восстановительный диск, где можно использовать графический интерфейс и настроить сетевые доступы.

    Данный надежный программный продукт для резервирования жестких дисков, несомненно, достоин того, чтобы в последней версии ПО Macrium Reflect Free скачать бесплатно без регистрирования и SMS. На официальном сайте компании можно получить помощь от тех. поддержки компании, оставить комментарии, отзывы, скачать инструкцию с описанием работы программы, поставить оценку использования этого продукта, также можно купить платную версию. Настоятельно рекомендуем или включить автообновление, или скачать Macrium Reflect Free 30-дневную пробную версию с этой страницы programmywindows.com на русском языке в последней версии для компьютера совершенно бесплатно. Облегчить себе поиск обновлений не сложно, просто качайте обновления здесь.

    Macrium Reflect инструкция пользователя

    Вступление.

    Macrium Reflect - бесплатная программа для создания образов жестких дисков и разделов. Программа позволяет как создавать, так и восстанавливать разделы, так же доступна опция просмотра созданных бекапов, и их редактирование. Благодаря точному алгоритму создания образов, Macrium Reflect в считанные минуты создает бекап практически любого раздела, сжимая данные в несколько раз. Так диск C:/ размером в 30 гигабайт, с занятым пространством в 11 гигабайт был сжат в образ размером в 3,88 гигабайта.

    Применение.

    Одна из главных причин использования программы Macrium Reflect - экономия времени. Для наглядности приведу простой пример. После установки операционной системы Windows пользователь начинает постепенно наполнять ее софтом, со временем, подборка программного обеспечения на компьютере сводится к использованию одних и тех же программ. Для офисной работы используется LibreOffice, для прослушивания музыки Winyl, либо WinAmp, тот же Aimp достоин внимания, для просмотра видео - VLC. Для выполнения узкоспециализированных задач - иной софт.

    Так вот, а теперь представим себе что в один прекрасный момент просто необходимо переустановить систему, причин по которой она будет работать с перебоями предостаточно - будь-то действие вирусов, аппаратный сбой, или просто - «пришло время». Сама переустановка Windows не несет в себе ничего хлопотного, основная часть работы состоит в установке необходимого программного обеспечения, а на это может уйти ни один день. Каков выход из сложившейся ситуации? Правильно, использование программ способных создать копию раздела жесткого диска. Именно программа Macrium Reflect и способна удовлетворить нашу потребность, к тому же она бесплатна.

    Пошаговая инструкция.

    И так, прежде всего, для того что бы работа с программой принесла удовольствие, стоит изначально потрудиться. Для этого стоит выделить время, и переустановить систему с нуля. То есть, отформатировать раздел на котором планируется разместить операционную систему, установить ее, после чего инсталлировать все драйвера, и тот набор программ который жизненно необходим в повседневной работе. Если на текущий момент ОС"ь работает как часики, предыдущий совет можно опустить, решайте сами.

    И так, ОС установлена, драйвера на месте, программы там же:). Устанавливаем Macrium Reflect, сама инсталляция программы не отличается от стандартной процедуры установки программ, надеюсь трудностей она не вызовет.

    После запуска перед нами предстает главное окно программы, несмотря на отсутствие русского языка, работа с программой интуитивно понятна и не должна вызвать проблем:



    Для начала создания образа вызываем «Мастер создания образов»:

    Так выглядит приветствие «Мастера создания образов»



    На следующем этапе необходимо указать образ какого именно раздела мы планируем создать, так как обычно операционная система устанавливается на диск С, то его и выбираем:



    Следующий шаг потребует от нас указания в места для хранения самого образа раздела:



    Доступны для работы следующие пункты:

    • Локальный диск - раздел жесткого диска (отличный от того, образ которого мы создаем), это может быть диск D:
    • Сетевой ресурс - если есть доступ к сетевым дискам, папкам, образ можно сохранить там.
    • CD/DVD диск - при наличии пишущего привода, образ можно записать непосредственно на сам диск.

    Кстати, рекомендую сохранить образ, изначально, на другом разделе локального диска, такой вариант подразумевает меньший процент ошибок во время создания образа. Потом его можно скопировать на сколь угодное количество флешек, cd-r"ок и прочих носителей, для предотвращения потери образа.

    В нижней части текущего окна можно задать имя будущего образа, если этого не сделать Macrium Reflect автоматически пропишет имя образа. Кстати. Этот вариант рекомендуют сами разработчики.

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



    Жмем Finish, в появившемся окошке ОК, и идем пить кофе, на создание образа может уйти от 5 до 10 минут, все зависит от размера раздела образ которого мы создаем.



    По окончанию резервного копирования программа выведет итоговую информацию:



    Все готово, образ успешно создан.

    Теперь, если система стала «барахлить», и ее просто необходимо переустановить, нет надобности проводить за компьютером пол дня, стоит только восстановить созданный нами образ обратно на диск C:/ и продолжить работу.

    Восстановление.

    Создаем загрузочный диск.

    Для начала создания загрузочного диска запускаем мастер:


    Главное окно мастера предлагает нам два варианта для создания загрузочного диска, на основе ОС Linux, либо Bart PE.



    Причем, создание образа на базе BartPe недоступна из под Windows Vista/7. Создание загрузочного диска может происходить непосредственно на cd-r, либо в iso-файл. Второй вариант предпочтительней, так как в дальнейшем образ можно скопировать на флешку, и загрузиться с нее. Сделать это можно программой .

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

    Основной смысл это: выбрать наш файл-образ -> указать какой раздел мы будет восстанавливать -> указать на какой раздел мы его распаковываем -> и вперед:) ...





















    Если что-то непонятно прошу всех в комментарии к статье, но, лучше в ветку форума -

    Просмотров: 54963

    Рефлексия (от позднелат. reflexio - обращение назад) - это механизм исследования данных о программе во время её выполнения. Рефлексия позволяет исследовать информацию о полях, методах и конструкторах классов. Можно также выполнять операции над полями и методами которые исследуются. Рефлексия в Java осуществляется с помощью Java Reflection API. Этот интерфейс API состоит из классов пакетов java.lang и java.lang.reflect. С помощью интерфейса Java Reflection API можно делать следующее:

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

    Получение объекта типа Class

    MyClass a = new MyClass(); Class aclass = a.getClass(); Самое простое, что обычно делается в динамическом программировании, - это получают объект типа java.lang.Class. Если у нас есть экземпляр объекта Class мы можем получить всевозможную информацию об этом классе и даже осуществлять операции над ним. Вышеприведенный метод getClass() часто полезен тогда когда есть экземпляр объекта, но не известно какого класса этот экземпляр. Если у нас есть класс, для которого в момент компиляции известен тип, то получить экземпляр класса ещё проще. Class aclass = MyClass.class; Class iclass = Integer.class; Если имя класса не известно в момент компиляции, но становится известным во время выполнения программы, можно использовать метод forName(), чтобы получить объект Class. Class c = Class.forName("com.mysql.jdbc.Driver");

    Получение имени класса

    Class c = myObject.getClass(); String s = c.getName(); Объект типа String, возвращаемый методом getName(), будет содержать полностью уточненное имя класса, т.е. если типом объекта myObject будет Integer, то результат будет вида java.lang.Integer .

    Исследование модификаторов класса

    Class c = obj.getClass(); int mods = c.getModifiers(); if (Modifier.isPublic(mods)) { System.out.println("public"); } if (Modifier.isAbstract(mods)) { System.out.println("abstract"); } if (Modifier.isFinal(mods)) { System.out.println("final"); } Чтобы узнать, какие модификаторы были применены к заданному классу, сначала нужно с помощью метода getClass получить объект типа Class, представляющий данный класс. Затем нужно вызвать метод getModifiers() для объекта типа Class, чтобы определить значение типа int, биты которого представляют модификаторы класса. После этого можно использовать статические методы класса java.lang.reflect.Modifier, чтобы определить, какие именно модификаторы были применены к классу.

    Нахождение суперклассов

    Class c = myObj.getClass(); Class superclass = c.getSuperclass(); Можно также использовать метод getSuperclass() для объекта Class, чтобы получить объект типа Class, представляющий суперкласс рефлексированного класса. Нужно не забывать учитывать, что в Java отсутствует множественное наследование и класс java.lang.Object является базовым классом для всех классов, вследствие чего если у класса нет родителя то метод getSuperclass вернет null. Для того чтобы получить все родительские суперклассы, нужно рекурсивно вызывать метод getSuperclass().

    Определение интерфейсов, реализуемых классом

    Class c = LinkedList.class; Class interfaces = c.getInterfaces(); for(Class cInterface: interfaces) { System.out.println(cInterface.getName()); } С помощью рефлексии можно также определить, какие интерфейсы реализованы в заданном классе. Метод getInterfaces() вернет массив объектов типа Class. Каждый объект в массиве представляет один интерфейс, реализованный в заданном классе.

    Исследование, получение и установка значений полей класса.

    Class c = obj.getClass(); Field publicFields = c.getFields(); for (Field field: publicFields) { Class fieldType = field.getType(); System.out.println("Имя: " + field.getName()); System.out.println("Тип: " + fieldType.getName()); } Чтобы исследовать поля принадлежащие классу, можно воспользоваться методом getFields() для объекта типа Class. Метод getFields() возвращает массив объектов типа java.lang.reflect.Field, соответствующих всем открытым полям объекта. Эти открытые поля необязательно должны содержаться непосредственно внутри класса, с которым вы работаете, они также могут содержатся в суперклассе, интерфейсе или интерфейсе представляющем собой расширение интерфейса, реализованного классом. С помощью класса Field можно получить имя поля, тип и модификаторы. Если известно имя поля, то можно получить о нем информацию с помощью метода getField() Class c = obj.getClass(); Field nameField = c.getField("name"); Методы getField() и getFields() возвращают только открытые члены данных класса. Если требуется получить все поля некоторого класса нужно использовать методы getDeclaredField() и getDeclaredFields(). Эти методы работают точно также как их аналоги getField() и getFields(), за исключением того, что они возвращают все поля, включая закрытые и защищенные. Чтобы получить значение поля, нужно сначала получить для этого поля объект типа Field затем использовать метод get(). Метод принимает входным параметром ссылку на объект класса. Class c = obj.getClass(); Field field = c.getField("name"); String nameValue = (String) field.get(obj) Так же у класса Field имеются специализированные методы для получения значений примитивных типов: getInt(), getFloat(), getByte() и др.. Для установки значения поля, используется метод set(). Class c = obj.getClass(); Field field = c.getField("name"); field.set(obj, "New name"); Для примитивных типов имеются методы setInt(), setFloat(), setByte() и др. Вопрос к читателю, можно ли изменить значение private поля? А private final? Ответ узнаем чуть позже.

    Исследование конструкторов класса

    Class c = obj.getClass(); Constructor constructors = c.getConstructors(); for (Constructor constructor: constructors) { Class paramTypes = constructor.getParameterTypes(); for (Class paramType: paramTypes) { System.out.print(paramType.getName() + " "); } System.out.println(); } Чтобы получить информацию об открытых конструкторах класса, нужно вызвать метод getConstructors() для объекта Class. Этот метод возвращает массив объектов типа java.lang.reflect.Constructor. С помощью объекта Constructor можно затем получить имя конструктора, модификаторы, типы параметров и генерируемые исключения. Можно также получить по отдельному открытому конструктору, если известны типы его параметров. Class paramTypes = new Class { String.class, int.class }; Constructor aConstrct = c.getConstructor(paramTypes); Методы getConstructor() и getConstructors() возвращают только открытые конструкторы. Если требуется получить все конструкторы класса, включая закрытые можно использовать методы getDeclaredConstructor() и getDeclaredConstructors() эти методы работают точно также, как их аналоги getConstructor() и getConstructors().

    Исследование информации о методе, вызов метода.

    Class c = obj.getClass(); Method methods = c.getMethods(); for (Method method: methods) { System.out.println("Имя: " + method.getName()); System.out.println("Возвращаемый тип: " + method.getReturnType().getName()); Class paramTypes = method.getParameterTypes(); System.out.print("Типы параметров: "); for (Class paramType: paramTypes) { System.out.print(" " + paramType.getName()); } System.out.println(); } Чтобы получить информацию об открытых методах класса, нужно вызвать метод getMethods() для объекта Class. Этот метод возвращает массив объектов типа java.lang.reflect.Method. Затем с помощью объекта Method можно получить имя метода, тип возвращаемого им значения, типы параметров, модификаторы и генерируемые исключения. Также можно получить информацию по отдельному методу если известны имя метода и типы параметров. Class c = obj.getClass(); Class paramTypes = new Class { int.class, String.class}; Method m = c.getMethod("methodA", paramTypes); Методы getMethod() и getMethods() возвращают только открытые методы, для того чтобы получить все методы класса не зависимо от типа доступа, нужно воспользоватся методами getDeclaredMethod() и getDeclaredMethods(), которые работают точно также как и их аналоги (getMethod() и getMethods()). Интерфейс Java Reflection Api позволяет динамически вызвать метод, даже если во время компиляции имя этого метода неизвестно (Имена методов класса можно получить методом getMethods() или getDeclaredMethods()). В следующем примере рассмотрим вызов метода зная его имя. Например метод getCalculateRating: Class c = obj.getClass(); Class paramTypes = new Class { String.class, int.class }; Method method = c.getMethod("getCalculateRating", paramTypes); Object args = new Object { new String("First Calculate"), new Integer(10) }; Double d = (Double) method.invoke(obj, args); В данном примере сначала получаем объект Method по имени метода getCalculateRating, затем вызываем метод invoke() объекта Method, и получаем результат работы метода. Метод invoke принимает два параметра, первый - это объект, класс которого объявляет или наследует данный метод, а второй - массив значений параметров, которые передаются вызываемому методу. Если метод имеет модификатор доступа private, тогда выше приведённый код нужно модифицировать таким образом, для объекта Method вместо метода getMethod() вызываем getDeclaredMethod(), затем для получения доступа вызываем setAccessible(true) .

    Method method = c.getDeclaredMethod("getCalculateRating", paramTypes); method.setAccessible(true);

    Загрузка и динамическое создание экземпляра класса

    Class c = Class.forName("Test"); Object obj = c.newInstance(); Test test = (Test) obj; С помощью методов Class.forName() и newInstance() объекта Class можно динамически загружать и создавать экземпляры класса в случае, когда имя класса неизвестно до момента выполнения программы. В приведенном коде мы загружаем класс с помощью метода Class.forName(), передавая имя этого класса. В результате возвращается объект типа Class. Затем мы вызываем метод newInstance() для объекта типа Class, чтобы создать экземпляры объекта исходного класса. Метод newInstance() возвращает объет обобщенного типа Object, поэтому в последней строке мы приводим возвращенный объект к тому типу, который нам нужен.

    И напоследок, пример модификации private полей.

    import java.lang.reflect.Field; class WithPrivateFinalField { private int i = 1; private final String s = "String S"; private String s2 = "String S2"; public String toString() { return "i = " + i + ", " + s + ", " + s2; } } public class ModifyngPrivateFields { public static void main(String args) throws Exception { WithPrivateFinalField pf = new WithPrivateFinalField(); Field f = pf.getClass().getDeclaredField("i"); f.setAccessible(true); f.setInt(pf, 47); System.out.println(pf); f = pf.getClass().getDeclaredField("s"); f.setAccessible(true); f.set(pf, "MODIFY S"); System.out.println(pf); f = pf.getClass().getDeclaredField("s2"); f.setAccessible(true); f.set(pf, "MODIFY S2"); System.out.println(pf); } } Из приведённого кода видно что private поля можно изменять. Для этого требуется получить объект типа java.lang.reflect.Field с помощью метода getDeclaredField(), вызвать метод setAccessible(true) и с помощью метода set() устанавливаем значение поля. Учтите что поле final при выполнении данной процедуры не выдаёт предупреждений, а значение поля остаётся прежним, т.е. final поля остаются неизменные.