Java annotation
Вложений: 1
Java предлагает разработчику очень интересный механизм аннотаций.
Что такое аннотация? А это все, что начинается с @ например, @Override :) Однако не секрет, что многие неплохие l2 разработчики не пользуются ничем кроме вышеупомянутой @Override, да и вообще плохо представляют преимущества этого механизма. То что описано ниже, предназначено "пролить луч света в темном царстве". И так. Что такое аннотация, и как ее можно использовать в мирных целях. Начнем с того, какие этапы бывают в жизни программы. Этап первый - написание (зачатие) он нам совершенно не интересен :) Этап второй - компиляция. Здесь уже возможно использование аннотаций. Например та же @Override говорит компилятору "пройдись по суперкласам, поищи метод с тем же именем и теми же параметрами. Не найдешь - скажи программисту, что он идиот". Этот этап интересен, но не очень. Этап третий - выполнение. Вот тут мы и будем творить. На этом этапе аннотация становится частью RTTI. Что такое RTTI? Это Run-Time Type Information.Что, не знаете что такое? Однако пользуетесь :) Пример? a instanceof Object это типичное использование RTTI, ибо класс объекта есть его элемент. Вообще, для работы с RTTI есть куча методов класса Class (собственно класс Class это и есть RTTI). И так, зачем мы можем использовать аннотации? Вообще-то, использование аннотаций основано на принципе "лучше полдня потерять, потом за 5 мин долететь". Вот простой, и жизненный пример. У нас есть xml файл вида Код:
<?xml version="1.0" ?> Код:
public class NamedObject { Код:
public class NamedObject { - Да не вопрос, строка кода! А 100500 новых полей? "у, мля" - сказали программисты и ушли писать код.... А теперь изображу то же самое с использование аннотаций Код:
public class NamedObject extends AnnotatedXMLNode { Код:
@XMLField(nodename="weight",property="set") Все дело в "волшебном классе" AnnotatedXMLNode. Вот его, да и сами аннотации мы будем разбирать ниже. NB! Буду писать несколькими постами, с интервалом в 10-15 мин. С примерами. Просьба писать ваши вопросы после поста "на сегодня все". Добавлено через 30 минут И так, для начала напишем сами используемые аннотации. Описание аннотации выглядит как описание интерфейса, только перед словом interface добавляется символ @ Код:
public @interface XMLField { модификаторы не нужны, а default означает что данное поле можно не указывать. т.е. @XMLField(property="zzz",node="mmm") - верно @XMLField(property="zzz") - верно @XMLField(node="mmm") - не верно И так, аннотацию мы сделали. Теперь неплохо бы сказать, когда она используется (компиляция, исполнение) и к какому типу применима (класс, поле). Делается это посредством... вы таки не поверите, но аннотаций :) Код:
@Target(ElementType.FIELD) Ну вот, аннотацию написали. Теперь будем учится ползать по классу, и делать много нехороших вещей (например, плевать на модификаторы private и protected :) ) Собственно "скелет" нашего AnnotatedXMLNode Код:
public class AnnotatedXMLNode { А вот теперь начнется самое интересное. Для начала нам надо найти все поля, во всех суперклассах имеющих аннотацию Node. Как ищется аннотация? Да очень просто! У класса Field есть метод isAnnotationPresent (впрочем, он есть у любого класса RTTI, как Class, Field, Method и т.д.) Вот с помощью него мы и будем искать аннотации. Кто-то спросит, а как полчить все поля класса?. Есть метод getDeclaredField у Class. Но тут есть грабли. Вот пример граблей. Код:
public class A { _a _b ? А вот фиг вам! getDeclaredFields() работает ТОЛЬКО для текущего класса. Так что будет _b Как нам получить все поля? А очень просто Код:
public void check() { } Добавлено через 3 часа 53 минуты Теперь начнем писать наш класс. Для начала соберем все поля, которые требуют чтения. Код:
private void Map<String,Map<String,Field>> _fields = new HashMap<String,Map<String,Field>>(); P.S. Уже поздно, дочь не дала дописать все за сегодня. Продолжу с утра Добавлено через 16 часов 39 минут Продолжаем изучение аннотаций. И так, мап с сответствием имя-поле мы получили, теперь вроде бы можем писать метод. Однако есть еще один "грабельки". Все поля у нас разного типа, а при работе с xml возвращается только тип String. Тут есть два способа. Первый - написать простейший сеттер. Второй - "подсмотреть" в Aion как сделаны трансфоромации STring --> type. Я приведу первый способ, работающий с двумя типами String и int Код:
private void setFieldVlue(Field f, String value) throws Exception { Код:
public void load(Node node) { Собственно сам наш загружемай класс Код:
public class MyXMLObject extends AnnotatedXMLNode { Код:
public class Main { Ну и сам XML-файл Код:
<?xml version="1.0" ?> Код:
G:\Samples\Annotations\build>java -cp ../bin Main Код:
public class MyXMLObject extends AnnotatedXMLNode { Код:
G:\Samples\Annotations\build>java -cp ../bin Main Ну вот, на сегодня все, задавайте вопросы. Ах, да. Все примеры в виде Eclipse-проекта - внизу |
Re: Java annotation
Аннотации это хорошо, досихпор работаю с собственным фреймворком конфигурации на базе метаданных (с валидацией данных и кучей удобных плюшек) - доволен я, довольны знакомые.
Зачем изобретать JAXB и XMLBeans чтобы мапить поля объектов на xml? Если надо конфигурировать объекты через XML то целесообразнее использовать аналогичную систему с ANT'овыми файлом сборки. Код:
private void setFieldVlue(Field f, String value) Код:
boolean oldAccess = field.isAccessible(); |
Re: Java annotation
Спасибо за замечания. Однако, целью этого "урока" было показать как работают аннотации, а не использование готовых. Я сознательно "изобретал велосипед" в примерах, что бы было понятно как весь этот механизм работает.
То же самое я могу и сказать про setFieldValue. Я не ставил себе задачу сделать рабочий фреймворк. |
Re: Java annotation
Спасибо хорошая тема.
|
Текущее время: 18:04. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot