Разделы презентаций


Рефлексия

Содержание

План лекцииПонятие рефлексииУчастники механизма рефлексииПолучение информации о классе

Слайды и текст этой презентации

Слайд 1Рефлексия
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 11.1
УНЦ «Инфоком»
Самара
2013

Рефлексия© Составление, Будаев Д.С., Гаврилов А.В., 2013Лекция 11.1УНЦ «Инфоком»Самара2013

Слайд 2План лекции

Понятие рефлексии

Участники механизма рефлексии

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

План лекцииПонятие рефлексииУчастники механизма рефлексииПолучение информации о классе

Слайд 3Понятие рефлексии
Рефлексия (от лат. reflexio – обращение назад) – обращение

субъекта на себя самого, на свое знание или на свое

собственное состояние

Рефлексия в Java – возможность программы анализировать саму себя, взаимодействуя с виртуальной машиной Java (JVM)
Понятие рефлексииРефлексия (от лат. reflexio – обращение назад) – обращение субъекта на себя самого, на свое знание

Слайд 4Возможности механизма рефлексии
Загрузка типов во время исполнения программы
Исследование структуры типов

и их элементов
Создание экземпляров классов
Вызов методов
Загрузка классов из набора байтов

Возможности механизма рефлексииЗагрузка типов во время исполнения программыИсследование структуры типов и их элементовСоздание экземпляров классовВызов методовЗагрузка классов

Слайд 5Участники механизма рефлексии
Класс java.lang.Class
Класс является метаклассом по отношению к другим

типам
Экземпляры класса Class описывают классы и интерфейсы выполняемого приложения
Методы класса

Class позволяют исследовать содержимое описываемого класса и его свойства

Класс java.lang.ClassLoader
Реализует механизмы загрузки классов
Участники механизма рефлексииКласс java.lang.ClassКласс является метаклассом по отношению к другим типамЭкземпляры класса Class описывают классы и интерфейсы

Слайд 6Участники механизма рефлексии
Пакет java.lang.reflect
Содержит ряд дополнительных и вспомогательных классов
Field
Описывает поле

объекта
Method
Описывает метод объекта
Constructor
Описывает конструктор объекта
Modifier
Инкапсулирует работу с модификаторами
Array
Инкапсулирует работу с

массивами
Участники механизма рефлексииПакет java.lang.reflectСодержит ряд дополнительных и вспомогательных классовField	Описывает поле объектаMethod	Описывает метод объектаConstructor	Описывает конструктор объектаModifier	Инкапсулирует работу с

Слайд 7Получение представления класса
Метод static Class Class.forName(...) Возвращает ссылку на представление класса,

полное имя которого указывается параметром типа String
Псевдополе Object.class Ссылка на представление

указанного класса
Метод Class Object.getClass() Возвращает ссылку на представление класса, экземпляром которого является объект
Получение представления классаМетод static Class Class.forName(...) Возвращает ссылку на представление класса, полное имя которого указывается параметром типа

Слайд 8Получение представления класса
Метод Class[] Class.getClasses() Возвращает ссылку на массив ссылок на

объекты Class вложенных типов
Метод Class Class.getDeclaringClass() Для вложенных типов возвращает ссылку

на объект Class внешнего типа
Метод Class[] Class.getInterfaces() Возвращает ссылки на описания интерфейсов, от которых наследует тип
Метод Class Class.getSuperclass() Возвращает ссылку на описание родительского класса
Получение представления классаМетод Class[] Class.getClasses() Возвращает ссылку на массив ссылок на объекты Class вложенных типовМетод Class Class.getDeclaringClass()

Слайд 9Получение информации о классе
import java.lang.reflect.*;

class ListMethods {
public static void

main(String[] argv) throws

ClassNotFoundException {
Class c = Class.forName(argv[0]);
Constructor[] cons = c.getConstructors( );
printList("Constructors", cons);
Method[] meths = c.getMethods( );
printList("Methods", meths);
Field[] fields = c.getFields();
printList("Fields", fields);
}
static void printList(String s, Object[] o) {
System.out.println("*** " + s + " ***");
for (int i = 0; i < o.length; i++)
System.out.println(o[i].toString( ));
}
}
Получение информации о классеimport java.lang.reflect.*;class ListMethods { public static void main(String[] argv)

Слайд 10Возможности класса Class
Загрузка класса в JVM по его имени static Class

forName(String name)
Определение вида типа boolean isInterface() boolean isLocalClass()
Получение родительских типов Class getSuperclass() Class[] getInterfaces()


Получение вложенных типов Class[] getClasses()
Создание объекта Object newInstance()
Возможности класса ClassЗагрузка класса в JVM по его имени static Class forName(String name)Определение вида типа boolean isInterface()

Слайд 11Возможности класса Class
Получение списка всех полей и конкретного поля по

имени Field[] getFields() Field getField(...)
Получение списка всех методов и конкретного метода по

имени и списку типов параметров Method[] getMethods() Method[] getMethod(...)
Получение списка всех конструкторов и конкретного конструктора по списку типов параметров Constructor[] getConstructors() Constructor getConstructor(...)
Возможности класса ClassПолучение списка всех полей и конкретного поля по имени Field[] getFields() Field getField(...)Получение списка всех

Слайд 12Исследование методов
...
Class cls = classC.getClass();
Method[] methods = cls.getMethods();

for (int i

= 0; i < methods.length; i++) {
System.out.println("Метод с именем:"

+ methods[i].getName());

Class[] paramTypes = methods[i].getParameterTypes();
for (int j = 0; j < paramTypes.length; j++) {
System.out.println("Параметр типа:" + paramTypes[j].getName());
}

System.out.println("Возвращает:" + methods[i].getReturnType().getName());
System.out.println("");
}
...
Исследование методов...Class cls = classC.getClass();Method[] methods = cls.getMethods();for (int i = 0; i < methods.length; i++) {

Слайд 13Передача параметров в методы
Поскольку на момент написания программы типы и

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

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

Возвращается всегда тип Object
Для ссылочного типа используется приведение типа или рефлексивное исследование
Для примитивных типов возвращается ссылка на экземпляр класса-оболочки, содержащий возвращенное значение
Передача параметров в методыПоскольку на момент написания программы типы и даже количество параметров неизвестно, используется другой подход:Ссылки

Слайд 14Создание экземпляров классов
Метод Object Class.newInstance() Возвращает ссылку на новый экземпляр класса,

используется конструктор по умолчанию

Метод Object Constructor.newInstance( Object[] initArgs) Возвращает ссылку на

новый экземпляр класса, с использованием конструктора и указанными параметрами конструктора
Создание экземпляров классовМетод Object Class.newInstance() Возвращает ссылку на новый экземпляр класса, используется конструктор по умолчаниюМетод Object Constructor.newInstance(

Слайд 15Вызов методов
Прямой вызов Если на момент написания кода известен реальный тип

для полученной ссылки обобщенного типа

Вызов через экземпляр класса Method Object Method.invoke(Object

obj, Object[] args)
obj – ссылка на объект, у которого должен быть вызван метод
принято передавать null, если метод статический
args – список параметров для вызова методов
Вызов методовПрямой вызов Если на момент написания кода известен реальный тип для полученной ссылки обобщенного типаВызов через

Слайд 16Вызов статического метода
import java.lang.reflect.*;
public class Main {
public static void

main(String[] args) {
if (args.length == 3) {

try {
Class c = Class.forName(args[0]);
Method m = c.getMethod(args[1], new Class [] {Double.TYPE});
Double val = Double.valueOf(args[2]);
Object res = m.invoke(null, new Object [] {val});
System.out.println(res.toString());
} catch (ClassNotFoundException e) {
System.out.println("Класс не найден");
} catch (NoSuchMethodException e) {
System.out.println("Метод не найден");
} catch (IllegalAccessException e) {
System.out.println("Метод недоступен");
} catch (InvocationTargetException e) {
System.out.println("При вызове возникло исключение");
}
}
}}
Вызов статического методаimport java.lang.reflect.*;public class Main { public static void main(String[] args) {  if (args.length ==

Слайд 17Нововведения Java5 Часть 1
© Составление, Будаев Д.С., Гаврилов А.В., 2013
Лекция 11.2
УНЦ

«Инфоком»
Самара
2013

Нововведения Java5 Часть 1© Составление, Будаев Д.С., Гаврилов А.В., 2013Лекция 11.2УНЦ «Инфоком»Самара2013

Слайд 18План лекции
Обзор нововведений
Статический импорт
Автобоксинг
Переменное количество аргументов
Параметризованные типы
Улучшенный цикл for
Перечислимые типы
Аннотации

План лекцииОбзор нововведенийСтатический импортАвтобоксингПеременное количество аргументовПараметризованные типыУлучшенный цикл forПеречислимые типыАннотации

Слайд 19Что же произошло?
Автоупаковка и автораспаковка (автобоксинг)
Настраиваемые типы
Улучшенный цикл for
Аргументы переменной

длины
Перечислимые типы
Метаданные
Статический импорт
Форматированный ввод/вывод
Изменения пакетов

Что же произошло?Автоупаковка и автораспаковка (автобоксинг)Настраиваемые типыУлучшенный цикл forАргументы переменной длиныПеречислимые типыМетаданныеСтатический импортФорматированный ввод/выводИзменения пакетов

Слайд 20Проблема
Имеется:



Хотелось бы:

hypot = Math.sqrt(Math.pow(side1, 2)

+ Math.pow(side2, 2));
hypot = sqrt(pow(side1, 2)

+ pow(side2, 2));
ПроблемаИмеется:Хотелось бы:hypot = Math.sqrt(Math.pow(side1, 2)       + Math.pow(side2, 2));hypot = sqrt(pow(side1, 2)

Слайд 21Статический импорт
Импорт элемента типа
import static pkg.TypeName.staticMemberName;



Импорт всех элементов типа
import static

pkg.TypeName.*;

import static java.lang.Math.sqrt;
import static java.lang.Math.pow;
import static java.lang.Math.*;

Статический импортИмпорт элемента типа	import static pkg.TypeName.staticMemberName;Импорт всех элементов типа	import static pkg.TypeName.*;import static java.lang.Math.sqrt;import static java.lang.Math.pow;import static java.lang.Math.*;

Слайд 22Особенности статического импорта
Повышает удобство написания программ и уменьшает объем кода

Уменьшает

удобство чтения программ

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

Мораль: рекомендуется к использованию только

когда действительно необходим
Особенности статического импортаПовышает удобство написания программ и уменьшает объем кодаУменьшает удобство чтения программПриводит к конфликтам именМораль: рекомендуется

Слайд 23Проблема
Имеется:



Хотелось бы:

List list = new LinkedList();
list.add(new Integer(1));
list.add(new Integer(10));
List list =

new LinkedList();
list.add(1);
list.add(10);

ПроблемаИмеется:Хотелось бы:List list = new LinkedList();list.add(new Integer(1));list.add(new Integer(10));List list = new LinkedList();list.add(1);list.add(10);

Слайд 24Автоупаковка / автораспаковка
Автоупаковка – процесс автоматической инкапсуляции данных простого типа

в экземпляр соответствующего ему класса-обертки в случаях, когда требуется значение

ссылочного типа
Автораспаковка – процесс автоматического извлечения примитивного значения из объекта-упаковки в случаях, когда требуется значение примитивного типа

List list = new LinkedList();
list.add(1);
int b = (Integer)list.get(0) + 10;

Автоупаковка / автораспаковкаАвтоупаковка – процесс автоматической инкапсуляции данных простого типа в экземпляр соответствующего ему класса-обертки в случаях,

Слайд 25Особенности автоупаковки
Происходит при присваивании, вычислении выражений и при передаче параметров
Объекты

создаются без использования ключевого слова new

Объекты создаются!
Вотще полагать, что примитивные

типы не нужны
Автоупаковка требует существенных ресурсов
Злоупотреблять автоупаковкой вообще не стоит!

Integer i = 15;

Особенности автоупаковкиПроисходит при присваивании, вычислении выражений и при передаче параметровОбъекты создаются без использования ключевого слова newОбъекты создаются!Вотще

Слайд 26Проблема
Имеется:



Хотелось бы:

int s1 = sum(new int[] {1, 2});
int s2 =

sum(new int[] {1, 2, 3});
int s1 = sum(1, 2);
int s2

= sum(1, 2, 3, 4);
ПроблемаИмеется:Хотелось бы:int s1 = sum(new int[] {1, 2});int s2 = sum(new int[] {1, 2, 3});int s1 =

Слайд 27Переменное количество аргументов
Пример метода




Пример вызова
int sum(int ... a) {
int

s = 0;
for (int i = 0; i

a.length; i++)
s += a[i];
}

int s2 = sum(1, 2, 3);
int s1 = sum(new int[] {1, 2});

Переменное количество аргументовПример методаПример вызоваint sum(int ... a) { int s = 0; for (int i =

Слайд 28Особенности переменного количества аргументов
Внутри там все равно живет массив…
Аргумент переменной

длинны в методе может быть только один
Аргумент переменной длинны должен

быть последним в списке аргументов метода
В сочетании с перегрузкой методов способен приводить к изумительным ошибкам компиляции в виду неоднозначности кода
Особенности переменного количества аргументовВнутри там все равно живет массив…Аргумент переменной длинны в методе может быть только одинАргумент

Слайд 29Проблема
Имеется:



Хотелось бы:

List list= new LinkedList ();
list.add(10);
list.add(5);
list.add((Integer)list.get(0) + (Integer)list.get(1));
List list= new

LinkedList();
list.add(10);
list.add(5);
list.add(list.get(0) + list.get(1));

ПроблемаИмеется:Хотелось бы:List list= new LinkedList ();list.add(10);list.add(5);list.add((Integer)list.get(0) + (Integer)list.get(1));List list= new LinkedList();list.add(10);list.add(5);list.add(list.get(0) + list.get(1));

Слайд 30Параметризованные типы
Параметризованные типы (настраиваемые типы, generic types)
Позволяют создавать классы, интерфейсы

и методы, в которых тип обрабатываемых данных задается как параметр
Позволяют

создавать более компактный код, чем универсальные (обобщенные) типы, использующие ссылки типа Object
Обеспечивают автоматическую проверку и приведение типов
Позволяют создавать хороший повторно используемый код
Параметризованные типыПараметризованные типы (настраиваемые типы, generic types)Позволяют создавать классы, интерфейсы и методы, в которых тип обрабатываемых данных

Слайд 31Скромный пример
Пример класса




Пример использования
class Generic {
T obj;
Generic(T o)

{obj = o;}
T getObj() {return obj;};
}
Generic iObj;
iObj = new

Generic(33);
int i = iObj.getObj() + 10;
Скромный примерПример классаПример использованияclass Generic { T obj; Generic(T o) {obj = o;} T getObj() {return obj;};}Generic

Слайд 32Особенности параметризованных типов
Использовать примитивные типы в качестве параметров-типов нельзя

Если одинаковые

настраиваемые типы имеют различные аргументы, то это различные типы

Обеспечивается более

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

Слайд 33Общий синтаксис
Объявление настраиваемого типа
class имяКласса {...}


Создание ссылки и объекта настраиваемого

типа
имяКласса имяПеременной = new имяКласса(список-аргументов);
class Generic2 {...}
Generic2 gObj

= new
Generic2(10, "ok");
Общий синтаксисОбъявление настраиваемого типа	class имяКласса {...}Создание ссылки и объекта настраиваемого типа	имяКласса имяПеременной = new имяКласса(список-аргументов);class Generic2 {...}Generic2

Слайд 34Ограниченные типы
Ограничение типа позволяет использовать у ссылок методы и поля,

доступные в типе-ограничителе
Типы, не наследующие от указанного, не могут быть

использованы при создании объектов
Как имя типа может быть указан интерфейс!!!
Как имя типа может быть указан ранее введенный параметр!!!

class Stats {
T[] nums;
Stats(T[] o) {nums = o;}
double average() {
double sum = 0.0;
for(int i = 0; i < nums.length; i++)
sum += nums[i].doubleValue();
return sum / nums.length;
}
}

class Generic3> {...}

Ограниченные типыОграничение типа позволяет использовать у ссылок методы и поля, доступные в типе-ограничителеТипы, не наследующие от указанного,

Слайд 35Метасимвольный аргумент
Что делать при передаче экземпляров параметризованных типов в методы,

т.е. как писать сигнатуру?
Для этого используется метасимвол, обозначающий произвольный тип-параметр
class

Generic {
...
boolean compare(Generic o) {
return o.getObj() == obj;
}
Метасимвольный аргументЧто делать при передаче экземпляров параметризованных типов в методы, т.е. как писать сигнатуру?Для этого используется метасимвол,

Слайд 36Метасимвол с ограничениями
Ограничение сверху

sub>
Тип sub не допускается

Метасимвол с ограничениямиОграничение сверху

Слайд 37Параметризованные методы
Методы могут иметь собственные типы-параметры
Фактические аргументы, передаваемые в формальные

аргументы, имеющие тип-параметр, будут проверяться на соответствие типу, причем на

этапе компиляции
Пример метода





Пример использования

public static > T min(T[] v) {
T min = v[0];
for (int i = 1; i < v.length; i++)
if (min.compareTo(v[i]) > 0)
min = v[i];
return min;
}

System.out.println(min(new Integer[] {10, 15, 5}));

Параметризованные методыМетоды могут иметь собственные типы-параметрыФактические аргументы, передаваемые в формальные аргументы, имеющие тип-параметр, будут проверяться на соответствие

Слайд 38Ряд особенностей
Конструкторы могут быть параметризованными (даже если сам класс таковым

не является)
Интерфейсы могут быть параметризованными
Нельзя создавать объекты, используя типы-параметры
Статические члены

класса не могут использовать его типы-параметры
Настраиваемый класс не может расширять класс Throwable
От настраиваемых типов можно наследовать, есть ряд особенностей
Ряд особенностейКонструкторы могут быть параметризованными (даже если сам класс таковым не является)Интерфейсы могут быть параметризованнымиНельзя создавать объекты,

Слайд 39Ряд особенностей
Нельзя создать массив типа-параметра





Массивов элементов конкретной версии параметризованного типа

не бывает
class Generic {
T[] vals; //OK

Generic(T[] nums) {

//vals = new T[10]; //Не есть правильно!
vals = nums; //OK
}
}

//Generic[] gens = ew Generic[10];//Nicht OK
Generic[] gens = new Generic[10];

Ряд особенностейНельзя создать массив типа-параметраМассивов элементов конкретной версии параметризованного типа не бываетclass Generic { T[] vals; //OK

Слайд 40И как же это работает?
Механизм стирания
В реальном байт-коде никаких настраиваемых

типов в целом-то и нет…
Информация о настраиваемых типах удаляется на

стадии компиляции
Именно компилятор осуществляет контроль безопасности приведения типов
А внутри после компиляции все те же «обобщенные» классы, явные приведения типов и прочее, и прочее…
И как же это работает?Механизм стиранияВ реальном байт-коде никаких настраиваемых типов в целом-то и нет…Информация о настраиваемых

Слайд 41Ошибки неоднозначности
«Логически правильный» код





Оказывается неверным с точки зрения компилятора


И это

– самый простой пример…
public class Test {
T first(T[]

arr) {
return arr[0];
}
Object first(Object[] arr) {
return arr[0];
}
}

Test.java:6: first(T[]) is already defined in Test
Object first(Object[] arr) {
^

Ошибки неоднозначности«Логически правильный» кодОказывается неверным с точки зрения компилятораИ это – самый простой пример…public class Test {

Слайд 42Проблема
Имеется:



Хотелось бы:

int[] nums = {1, 2, 3, 4, 5};
int sum

= 0;
for (int i = 0; i < 5; i++)

sum += nums[i];

int[] nums = {1, 2, 3, 4, 5};
int sum = 0;
for (int x: nums)
sum += x;

ПроблемаИмеется:Хотелось бы:int[] nums = {1, 2, 3, 4, 5};int sum = 0;for (int i = 0; i

Слайд 43Улучшенный цикл for (for-each)
Общая форма записи
for (type iterVar : iterableObj) statement;

Тип

элемента
Переменная цикла
Агрегат с элементами
Тело цикла


Улучшенный цикл for (for-each)Общая форма записи	for (type iterVar : iterableObj) statement;Тип элементаПеременная циклаАгрегат с элементамиТело цикла

Слайд 44Работа улучшенного цикла for
В каждом витке цикла «извлекается» очередной элемент

агрегата
Ссылка на него (для ссылочных типов) или значение (для примитивных)

помещается в переменную цикла
Тип переменной цикла должен допускать присвоение элементов агрегата
Цикл выполняется до тех пор, пока не будут перебраны все элементы агрегата
Работа улучшенного цикла forВ каждом витке цикла «извлекается» очередной элемент агрегатаСсылка на него (для ссылочных типов) или

Слайд 45Обработка многомерных массивов
int sum = 0;
int nums[][] = new int[3][5];

for

(int i = 0; i < 3; i++)
for (int

j = 0; j < 5; j++)
nums[i][j] = (i + 1) * (j + 1);

for (int[] x: nums)
for (int y: x)
sum += y;
Обработка многомерных массивовint sum = 0;int nums[][] = new int[3][5];for (int i = 0; i < 3;

Слайд 46Особенности улучшенного цикла for
По сути это внутренний итератор
Переменная цикла доступна только

для чтения…
Порядок обхода в целом не определен…
Нет доступа к соседним

элементам…
Мораль:
Область применения обобщенного цикла for «несколько уже», чем у «необобщенной» версии
Зато для этого класса задач синтаксис обобщенного цикла существенно удобнее
Особенности улучшенного цикла forПо сути это внутренний итераторПеременная цикла доступна только для чтения…Порядок обхода в целом не

Слайд 47Внимание, вопрос!
А кто же управляет итерациями?
Агрегат обязан реализовывать интерфейс java.lang.Iterable
Сей

интерфейс содержит лишь один элемент Iterator iterator()
Данный, вроде бы знакомый, интерфейс,

тоже претерпел некоторые изменения:
boolean hasNext()
void remove()
T next()
Внимание, вопрос!А кто же управляет итерациями?Агрегат обязан реализовывать интерфейс java.lang.IterableСей интерфейс содержит лишь один элемент Iterator iterator()Данный,

Слайд 48Проблема
Имеется:




Хотелось бы:
class Apple {
public static final int JONATHAN =

0;
public static final int GOLDENDEL = 1;
public static

final int REDDEL = 2;
public static final int WINESAP = 3;
public static final int CORTLAND = 4;
}

enum Apple {
Jonathan, GoldenDel, RedDel, Winesap, Cortland
}

ПроблемаИмеется:Хотелось бы:class Apple { public static final int JONATHAN = 0; public static final int GOLDENDEL =

Слайд 49Перечислимые типы
Перечислимый тип
Apple

Константы перечислимого типа
Jonathan, GoldenDel, RedDel…

Объявление переменной


Присвоение переменной значения

Apple

ap;
ap = Apple.RedDel;

Перечислимые типыПеречислимый тип	AppleКонстанты перечислимого типа	Jonathan, GoldenDel, RedDel…Объявление переменнойПрисвоение переменной значенияApple ap;ap = Apple.RedDel;

Слайд 50Перечислимые типы
Проверка равенства


Использование в блоке переключателей

if(ap == Apple.GoldenDel)
switch(ap) {
case

Jonathan: //...
case Winsap: //...
default: //...
}

Перечислимые типыПроверка равенстваИспользование в блоке переключателейif(ap == Apple.GoldenDel)switch(ap) { case Jonathan: //... case Winsap: //... default: //...}

Слайд 51А теперь отличия от классики
Перечислимый тип – это класс!
Да к

тому же имеет методы!
public static enumType[] values() возвращает ссылку на массив

ссылок на все константы перечислимого типа


public static enumType valueOf(String str) возвращает константу перечислимого типа, имя которой соответствует указанной строке, иначе выбрасывает исключение

Apple[] allApples = Apple.values();

Apple ap = Apple.valueOf("Jonathan");

А теперь отличия от классикиПеречислимый тип – это класс!Да к тому же имеет методы!public static enumType[] values()

Слайд 52И еще отличия…
Можно определять конструкторы, добавлять поля и методы, реализовывать

интерфейсы

enum Apple {
Jonathan(10), GoldenDel(9), RedDel, Winsap(15), Cortland(8);
private int

price;
Apple(int p) {
price = p;
}
Apple() {
price = -1;
}
int getPrice() {
return price;
}
}
И еще отличия…Можно определять конструкторы, добавлять поля и методы, реализовывать интерфейсыenum Apple { Jonathan(10), GoldenDel(9), RedDel, Winsap(15),

Слайд 53Особенности перечислимых типов
Создавать экземпляры с помощью оператора new нельзя!

Все перечислимые

типы наследуют от класса java.lang.Enum

Клонировать экземпляры нельзя, сравнивать и выполнять

прочие стандартные операции – можно
Особенности перечислимых типовСоздавать экземпляры с помощью оператора new нельзя!Все перечислимые типы наследуют от класса java.lang.EnumКлонировать экземпляры нельзя,

Слайд 54Проблема
Имеется:
вся информация о классе содержится непосредственно в нем
комментарии доступны только

если доступен исходный текст
введение в класс методов, описывающих его семантику,

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

Слайд 55Метаданные
В основе механизма метаданных лежат так называемые аннотации
Аннотация – это

«интерфейс» специфического вида, позволяющий задавать описания классов и их элементов
Пример

объявления аннотации:

@interface MyAnnotation {
String str();
int val();
}

МетаданныеВ основе механизма метаданных лежат так называемые аннотацииАннотация – это «интерфейс» специфического вида, позволяющий задавать описания классов

Слайд 56Особенности аннотаций
Члены-методы имеют, скорее, смысл полей
Тела этих методов будут создаваться

автоматически
Аннотациями можно снабжать классы, методы, поля, параметры, константы перечислимых типов

и аннотации
Пример снабжения аннотацией:

@MyAnnotation(str = "Example", val= 100)
public static void myMeth() {...}

Особенности аннотацийЧлены-методы имеют, скорее, смысл полейТела этих методов будут создаваться автоматическиАннотациями можно снабжать классы, методы, поля, параметры,

Слайд 57Особенности аннотаций
В любом случае аннотация предшествует объявлению
Все аннотации наследуют от

интерфейса java.lang.annotation.Annotation
Во время выполнения программы информация об аннотациях извлекается средствами

рефлексии
После получения ссылки на объект аннотации у него можно вызывать методы, возвращающие заданные при аннотировании значения
Особенности аннотацийВ любом случае аннотация предшествует объявлениюВсе аннотации наследуют от интерфейса java.lang.annotation.AnnotationВо время выполнения программы информация об

Слайд 58Особенности аннотаций
Для методов допускаются значения по умолчанию
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
String

str() default "Testing";
int val() default 9000;
}
// @MyAnnotation()
// @MyAnnotation(str =

"some string");
// @MyAnnotation(val = 100);
// @MyAnnotation(str = "Testing", val = 100);
Особенности аннотацийДля методов допускаются значения по умолчанию@Retention(RetentionPolicy.RUNTIME)@interface MyAnnotation { String str() default

Слайд 59Особенности аннотаций
Бывают одночленные аннотации
Содержат один член и имеют сокращенную форму

записи






Бывают аннотации-маркеры
Предназначены только для пометки элементов
@interface MySingle {
int value();

//Имя только такое!
}
// @MySingle(100)

@interface MyMarker {}
// @MyMarker()

Особенности аннотацийБывают одночленные аннотации	Содержат один член и имеют сокращенную форму записиБывают аннотации-маркеры	Предназначены только для пометки элементов@interface MySingle

Слайд 60Правила сохранения аннотаций
Правила сохранения аннотаций определяют, в какой момент аннотации

будут уничтожены
Правила задаются с помощью перечислимого типа java.lang.annotation.RetentionPolicy
Существует три правила:
SOURCE аннотации

отбрасываются на этапе компиляции
CLASS сохраняются в байт-коде, но недоступны JVM во время выполнения программы
RUNTIME доступны JVM во время выполнения программы
В зависимости от цели аннотации ей задается то или иное правило сохранения
Правила сохранения аннотацийПравила сохранения аннотаций определяют, в какой момент аннотации будут уничтоженыПравила задаются с помощью перечислимого типа

Слайд 61Правила сохранения аннотаций
Задание правила сохранения производится с помощью аннотации java.lang.annotation.Retention
По

умолчанию задается правило CLASS
Пример задания правила сохранения:
@Retention(RetentionPolicy.RUNTIME)
@interface myAnnotation {
String

str();
int val();
}
Правила сохранения аннотацийЗадание правила сохранения производится с помощью аннотации java.lang.annotation.RetentionПо умолчанию задается правило CLASSПример задания правила сохранения:@Retention(RetentionPolicy.RUNTIME)@interface

Слайд 62Стандартные аннотации (работа с аннотациями)
@Retention Применяется к аннотациям, позволяет задать правило сохранения
@Documented Применяется

к аннотациям, указывает, что она должна быть документирована
@Target Применяется к аннотациям,

позволяет указать типы объектов, к которым данная аннотация может применятся
@Inherited Применяется к аннотациям классов, указывает, что данная аннотация будет унаследована потомками класса
Стандартные аннотации (работа с аннотациями)@Retention Применяется к аннотациям, позволяет задать правило сохранения@Documented Применяется к аннотациям, указывает, что

Слайд 63Стандартные аннотации (инструкции компилятора)
@Override Применяется к методам, указывает, что метод обязан переопределять

метод родительского класса
@Deprecated Указывает на то, что объявление является устаревшим или

вышедшим из употребления
@SupressWarnings Указывает на то, что указанные виды предупреждений компилятора не будут показываться
Стандартные аннотации (инструкции компилятора)@Override Применяется к методам, указывает, что метод обязан переопределять метод родительского класса@Deprecated Указывает на

Слайд 64Особенности аннотаций
Аннотация не может наследовать другую аннотацию
Методы аннотаций не должны

иметь параметров
Возвращаемый тип методов:
примитивный тип
String
Class
перечислимый тип
другой тип аннотации
массив элементов

одного из вышеперечисленных типов
Аннотации не могут быть настраиваемыми
Методы не могут объявлять исключения
Особенности аннотацийАннотация не может наследовать другую аннотациюМетоды аннотаций не должны иметь параметровВозвращаемый тип методов:примитивный типString Classперечислимый типдругой

Слайд 65
Спасибо за внимание!

Спасибо за внимание!

Слайд 66Дополнительные источники
Арнолд, К. Язык программирования Java [Текст] / Кен Арнолд,

Джеймс Гослинг, Дэвид Холмс. – М. : Издательский дом «Вильямс»,

2001. – 624 с.
Вязовик, Н.А. Программирование на Java. Курс лекций [Текст] / Н.А. Вязовик. – М. : Интернет-университет информационных технологий, 2003. – 592 с.
Эккель, Б. Философия Java [Текст] / Брюс Эккель. – СПб. : Питер, 2011. – 640 с.
Шилдт, Г. Java 2, v5.0 (Tiger). Новые возможности [Текст] / Герберт Шилдт. – СПб. : БХВ-Петербург, 2005. – 206 с.
JavaSE at a Glance [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/overview/index.html, дата доступа: 21.10.2011.
JavaSE APIs & Documentation [Электронный ресурс]. – Режим доступа: http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html, дата доступа: 21.10.2011.
Дополнительные источникиАрнолд, К. Язык программирования Java [Текст] / Кен Арнолд, Джеймс Гослинг, Дэвид Холмс. – М. :

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

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


Для правообладателей

Яндекс.Метрика