русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Извлечение информации о методах класса


Дата добавления: 2015-06-12; просмотров: 764; Нарушение авторских прав


Рефлексия редко используется напрямую; она существует в языке в основном для поддержки других возможностей, таких как сериализация объектов и компоненты JavaBeans. Однако существуют ситуации, в которых динамическая информация о классе просто незаменима. Для примера возьмем программу, выводящую на экран список методов некоторого класса. При просмотре исходного кода класса или его документации будут видны только те методы, которые были определены или переопределены именно в текущем классе. Но в классе может быть еще множество методов, доступных из его базовых классов. Искать их и сложно, и долго[28]. К счастью, рефлексия позволяет написать простой инструмент, выводящий полную информацию о полном интерфейсе класса. Вот как он работает:

//: typeinfo/ShowMethods.java

// Использование рефлексии для вывода полного списка методов

// класс, в том числе и определенных в базовом классе.

// {Args: ShowMethods}

import java.lang.reflect.*;

import java.util.regex.*;

import static net.mindview.util.Print.*;

 

public class ShowMethods {

 

private static String usage = "usage:\n"

+ "ShowMethods qualified.class.name\n"

+ "To show all methods in class or:\n"

+ "ShowMethods qualified.class.name word\n"

+ "To search for methods involving 'word'";

private static Pattern p = Pattern.compile("\\w+\\.");

 

public static void main(String[] args) {

if(args.length < 1) {

print(usage);

System.exit(0);

}

int lines = 0;

try {

 

Class<?> c = Class.forName(args[0]);

Method[] methods = c.getMethods();

Constructor[] ctors = c.getConstructors();

if(args.length == 1) {

 

for(Method method : methods)

print(p.matcher(method.toString()).replaceAll(""));



 

for(Constructor ctor : ctors)

print(p.matcher(ctor.toString()).replaceAll(""));

 

lines = methods.length + ctors.length;

 

} else {

 

for(Method method : methods)

if (method.toString().indexOf(args[1]) != -1) {

print(p.matcher(method.toString()).replaceAll(""));



lines++;

}

 

for(Constructor ctor : ctors)

if(ctor.toString().indexOf(args[1]) != -1) {

print(p.matcher(ctor.toString()).replaceAll(""));

lines++;

}

}

}catch(ClassNotFoundException e) {print("No such class: " + e);}

}

}

<spoiler text="Output:">

public static void main(String[]) public native int hashCodeO public final native Class getClass()

public final void wait(long.int) throws InterruptedException public final void wait() throws

InterruptedException public final native void wait(long) throws InterruptedException public

boolean equals(Object) public String toString() public final native void notifyО public final

native void notifyAll() public ShowMethods()

</spoiler> Методы класса Class.getMethods() и getConstructors() возвращают массивы объектов Method и Constructor, которые представляют методы и конструкторы класса. В каждом из этих классов есть методы для получения и анализа имен, аргументов и возвращаемых значений представляемых методов и конструкторов. Впрочем, также можно использовать простой метод toString(), как и сделано здесь, чтобы получить строку с полным именем метода. Остальная часть кода разбирает командную строку и определяет, подходит ли определенное выражение образцу для поиска (с использованием indexOf()), а после выделяет описатели имен классов. Результат, полученный от Class.forName(), не может быть известен во время компиляции, поэтому вся информация о сигнатуре методов становится доступной во время выполнения. Если вы тщательно изучите документацию по рефлексии из JDK, то увидите, что рефлексия позволяет установить необходимые аргументы и вызвать метод объекта, «абсолютно неизвестного» во время компиляции программы (чуть позже будут приведены соответствующие примеры). Скорее всего, вам эти возможности никогда не понадобятся, но сам факт их существования интересен.

Приведенный выше результат был получен из командной строки

java ShowMethods ShowMethods

На экран выводится открытый (public) конструктор по умолчанию, хотя в тексте программы такой конструктор не определяется. Тот конструктор, что имеется теперь в классе, автоматически сгенерирован компилятором. Если вы после этого сделаете класс ShowMethods не открытым (удалите из его определения спецификатор доступа public, то есть предоставите ему доступ в пределах пакета), сгенерированный компилятором конструктор исчезнет из списка методов. Сгенерированный конструктор имеет тот же уровень доступа, что и его класс.

Также интересно запустить программу в виде

java ShowMethods java.lang.String

с передачей дополнительного параметра char, int, String и т. п. Эта программа сэкономит вам немало времени при программировании, когда вы будете мучительно вспоминать, есть ли у этого класса определенный метод, если вам потребуется узнать, имеются ли у некоторого класса методы, воз­вращающие объекты Color, и т. д.



<== предыдущая лекция | следующая лекция ==>
Рефлексия: динамическая информация о классе | Динамические посредники


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.003 сек.