Слайд 9Рефлексия. Использование информации о классе
Исследование полей класса
Class c = obj.getClass();
Field[] publicFields = c.getFields();
for (Field field : publicFields) {
Class fieldType = field.getType();
System.out.println("Имя: " + field.getName());
}
Получение и изменение значения поля
Class c = obj.getClass();
Field field = c.getField(“myField");
String myFieldValue = (String) field.get(obj);
field.set(obj, "New value");
Слайд 10Рефлексия. Использование информации о классе
Исследование информации о методе
Class c =
obj.getClass();
Method[] methods = c.getMethods();
for (Method method : methods)
{
... method.getName();
... method.getReturnType();
for (Class paramType : method.getParameterTypes()) {
... paramType.getName();
}
}
Вызов метода
Class c = obj.getClass();
Class[] paramTypes = new Class[] {String.class};
Method method = c.getMethod(“getCalcValue", paramTypes);
Object[] args = new Object[]{new String(“Hello")};
Double d = (Double) method.invoke(obj, args);
Слайд 11Рефлексия. Использование информации о классе
Создание экземпляра класса
Class c = Class.forName("com.reflect.MyClass");
Object obj = c.newInstance();
MyClass a = (MyClass) obj;
Слайд 13Аннотации. Определение
Аннотация – дескриптор, включаемый в текст программы, и используются
для хранения метаданных, необходимых на разных этапах жизненного цикла программы.
Слайд 14Аннотации. Синтаксис
Объявление аннотации:
аннотации
модификаторы @interface ИмяАннотации {
объявление_элемента_1
объявление_элемента_2
. . .
}
Объявление элемента:
тип имяЭлемента() default значение;
Слайд 15Аннотации. Синтаксис
Допустимые типы элементов:
1. Простой тип
(int, short, long, byte, char,
double, float, boolean)
2. String
3. Class
4. Enum
5. Аннотация
6. Массив из приведенных выше типов
Слайд 16Аннотации. Синтаксис
Пометить аннотацией можно:
1. Пакет
2. Класс (включая Enum)
3. Интерфейс
4. Интерфейс аннотации
5. Метод
6. Конструктор
7. Поля класса
8. Параметры
9. Локальные переменные
Слайд 17Аннотации. Синтаксис
Пример:
import java.lang.annotation.*;
@Target(value=ElementType.FIELD)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface Name {
String
name();
String type() default “string”;
}
Слайд 18Аннотации. Синтаксис
Варианты записи
@Tested(name=”Alex”, date=”20.10.2010”)
Аннотацию, которая имеет только один элемент value,
можно в следующей форме:
@Color(ColorType.RED)
Если аннотация не имеет элементов, она называется
аннотацией-маркером и записывается так:
@Documented
Слайд 19Аннотации. Стандартные аннотации
Аннотации для аннотаций
@Retention (SOURCE, CLASS, RUNTIME)
Указывает жизненный цикл
аннотации.
@Target (Type, Field, Method, Parameter, Constructor, Local Variable, Annotation
Type, Package)
Указывает объекты, которые могут быть помечены аннотацией.
@Documented
Маркер-аннотация. Указывает, что аннотация должна быть добавлена в javadoc
@Inherited
Маркер-аннотация. Помечает аннотацию, которая будет унаследована потомком класса, отмеченного такой аннотацией
Слайд 20Аннотации. Стандартные аннотации
Другие стандартные аннотации
@Deprecated
Отмечает, что метод устарел
@SuppressWarnings(String[])
Указывает компилятору подавить
предупреждения компиляции, определенные в параметрах аннотации
@Override
Проверяет, переопределен ли метод
Слайд 21Аннотации. Варианты использования
• Маппинг данных
Может выполняться на этапе компиляции или
во время исполнения программы
• Альтернатива (замена или расширение) интерфейсов исполняемых файлов
(Runnable, Test)
• AOP: Транзакции, права доступа, логирование, обработка исключений, проверка пре- и пост-условий
См. библиотеки для AOP, например AspectJ
• Валидация данных @Validation(@Required, @CammelCase, @Regex(“[a-z]*”))
• Расширение комментариев, форматирование кода в IDE, статический анализ кода: @NotImplelented, @Bug(91355846578574587),
Слайд 22Рекомендуемая литература
“Core Java 2, Volume II – Advanced Features” –
Horstmann, Cornell
http://docs.oracle.com
http://habrahabr.ru
http://quizful.net