Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prikladnoe1.docx
Скачиваний:
10
Добавлен:
01.03.2016
Размер:
75.98 Кб
Скачать

1 Лабораторная работа №1 изучение динамического определения типов (rtti)

Цель работы: Изучить механизм динамического определения типов, и

механизма отражения в Java. Научиться применять возможность динамической загрузки произвольного класса по заданному имени.

1.1 Задание на лабораторную работу

В ходе выполнения данной лабораторной работы необходимо

реализовать приложение позволяющее просматривать содержимое jar-файлов с детальной информацией о находящихся в архиве – классах, интерфейсах, аннотациях, перечислениях, ресурсах и прочих файлах. Содержимое архива отобразить с учетом пакетов Java, используя классJTree, а детальную информацию о каждом элементе с использованием классаJList. Для каждого элемента архива вывести подробную информацию взависимости от типа элемента:

1)Для класса, интерфейса, аннотации или перечисления необходимо

2) Для ресурсов – тип, размер и дату модификации. Если файл является

3) Для прочих файлов – размер и дату модификации.

отобразить все члены – внутренние классы, интерфейсы, список полей,методов, конструкторов с указанием области видимости (private,default, protected, public), а также модификаторов – abstract, static, final,volatile, transient. файлом свойств, то вывести содержимое файла.

1.2 Краткие теоретические сведения

В Java вся информация о классе хранится в специальном объекте тип

Class. Для каждого класса в программе существует свой объект Class, который создается при загрузке класса, созданного на этапе компиляции и сохраненного на диске в файле с расширением class. Как получить экземпляр Class, соответствующий данному классу (или интерфейсу)?

1. Просто добавляем к имени класса суффикс .class, например: Class clazz = String.class; Т.е. используем литерал объекта Сlass.

2. Если мы располагаем экземпляром некоторого класса, может быть даже неизвестного в данной точке программы, можно вызвать метод getClass(), присутствующий в каждом Java-объекте (унаследованный от класса Object).

3. С. Вызываем статический метод класса Class.forName(), который возвращает экземпляр Class: Class clazz = Class.forName("Полное_имя_класса");

Литералы объектов Class работают с регулярными классами, а также с интерфейсами, массивами и примитивными типами. Class clazz = byte[].class;

В Java встроена возможность динамической загрузки произвольного

класса по заданному имени, и реализуется классом Class. public static Class forName(String className) throws ClassNotFoundException; Метод отыскивает в системе (в пути поиска CLASSPATH) класс с заданным именем className и возвращает соответствующий экземпляр класса Class. Имя класса должно быть полным, т.е. включать имя пакета. Если такой класс отсутствует, возбуждается исключение ClassNotFoundException. После того как получен объект типа Class можно создать экземпляр этого класса. Class clazz = Class.forName(String className); Object object = clazz.newInstance(); Для успешного выполнения этого метода у класса должен быть описан конструктор без параметров (конструктор по умолчанию), иначе бут возбуждено исключение InstantiationException. Чтобы работать с таким объектом необходимо знать методы класса, их параметры и возвращаемые значения. Для указания контракта класса используют интерфейсы. Рассмотрим, например: Необходимо реализовать приложение с возможностью перевода текста с одного языка на другой.

public interface LanguageTranslator{

/** Переводит текст src с языка srcLang на язык dstLang

*/

public String translate(String src, String srcLang, String dstLang);

}

Пусть программа не умеет выполнять перевод, но ее можно расширить

классами сторонних разработчиков, которые эту задачу решать умеют. Все эти классы должны реализовать интерфейс LanguageTranslator.

String source=”текст, требующий перевода”;

String srcLang=”RU”;

String dstLang=”EN”;

Class clazz = Class.forName(”полное.имя.класса.перводчика”)

Object o = clazz.new Instance();

if (!(o instanceof LanguageTranslator)){

throw new Exception(”Указанный класс не реализует интерфейс

переводчика”);}

String result = ((LanguageTranslate) o).translate(source, srcLang,

dstLang);

На описанной технике могут строиться системы plugin’ов – модулей,

добавляемых к уже работающей системе.

В классе Class<T> существует специальный набор методов для

исследования классов. Можно получить список всех конструкторов, методов,

полей, аннотаций, описанных в классе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]