Не хвастайтесь, что сложного в том, чтобы комментировать?

Java

Аннотации являются очень важной частью Java, но это также правда, что их часто упускают из виду. Я говорю это, потому что мы предпочитаем быть пользователем аннотации, а не создателем.@OverrideПримечание?@ServiceВы использовали аннотации? Но знаете ли вы, как настроить аннотацию?

Боюсь, вы будете мотать головой, махать рукой, стесняясь признаться, что у нее действительно не было обычая.

01, что такое аннотации

Аннотация - это концепция, представленная в Java 1.5. Как класс и интерфейс, он также относится к типу. Аннотации предоставляют серию данных для украшения программного кода (классы, методы, поля и т. Д.), Но аннотации не являются частью украшенного кода и не имеют прямого влияния на беговое влияние кода (как понять это предложение? ), Компилятором решает, что делать.

Давайте посмотрим на кусок кода, я написал его вскользь, кроме напечатанного на консоли слогана, больше ничего не имеет значения, хи-хи.

public class AutowiredTest {
    @Autowired
    private String name;

    public static void main(String[] args) {
        System.out.println("沉默王二,一枚有趣的程序员");
    }
}

уведомление@AutowiredЭто аннотация? Изначально он был внедрен в контейнер Spring, и теперь я безжалостно набрасываю имя переменной-члена, но этот код не включает Spring, то есть@AutowiredАннотация на данный момент является лишь украшением.

Причина, по которой я привел этот скучный пример, состоит в том, чтобы доказать свою точку зрения: аннотации не имеют прямого влияния на эффект выполнения кода Вы понимаете мое намерение?

02. Жизненный цикл аннотаций

Существует 3 политики для жизненного цикла аннотаций, которые определены в перечислении RetentionPolicy.

1) Источник: допустим в исходном файле и отбрасывается компилятором.

2) CLASS: Действителен в файлах байт-кода, сгенерированных компилятором, но отбрасывается во время выполнения JVM, которая обрабатывает файлы классов.

3) ВРЕМЯ РАБОТЫ: Действительно во время работы. Это также наиболее часто используемая стратегия в жизненном цикле аннотации, которая позволяет программам получать доступ к аннотациям посредством отражения и выполнять соответствующий код в соответствии с определением аннотации.

03. Аннотируйте цель украшения

Цель аннотации определяет, к какому уровню Java-кода будет применяться аннотация, некоторые аннотации применяются только к методам, некоторые — только к переменным-членам, некоторые — только к классам, а некоторые — к обоим.

Начиная с Java 9 существует 11 типов аннотаций, определенных в перечислении ElementType.

1) ТИП: используется для классов, интерфейсов, аннотаций, перечислений

2) FIELD: для полей (переменных-членов класса) или констант перечисления.

3) Метод: Используется для метода

4) Параметр: параметры для обычных методов или конструкторов.

5) КОНСТРУКТОР: используется для методов строительства

6) LOCAL_VARIABLE: для переменных

7) Annotation_Type: используется для аннотации

8) ПАКЕТ: для пакетов

9) TYPE_PARAMETER: для общих параметров

10) Type_use: используется для объявления типа в операторе, общем или литой заявлении

11) МОДУЛЬ: для модулей

04. Начните комментировать

Он говорит больше, а не в качестве комментария и более впечатляет. Линия и какие заметки делать? Панель аннотации поля, которая используется для последовательной маркировки объектов в JSON, когда не включать это поле.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface JsonField {
    public String value() default "";
}

1) Жизненный цикл аннотации JSONField - это время выполнения, то есть он действителен во время выполнения.

2) Цель оформления аннотации JsonField — FIELD, предназначенная для полей.

3) Создайте аннотации, которые необходимо использовать@interfaceключевые слова.

4) Аннотация JsonField имеет один параметр, имя — значение, тип — строка, а значение по умолчанию — пустая строка.

Почему имя параметра должно быть значением? Есть ли какой-то особый смысл?

Конечно, значение позволяет пользователю аннотации указать параметр без указания имени. Например, мы можем использовать на поле@JsonField(value = "沉默王二"), вы также можете поставитьvalue =опустить, стать@JsonField("沉默王二").

Тотdefault ""Есть ли какой-то особый смысл?

Конечно есть, это позволяет нам использовать прямо на поле@JsonField, без указания имени и значения параметра.

05. Используйте аннотации

Это мулы и лошади на прогулке, верно? в настоящее время@JsonFieldАннотация была разбита, и следующий шаг — как ее использовать.

Допустим есть класс автора, у него есть 3 поля, а именно age, name и bookName, последние 2 поля, которые надо сериализовать.

public class Writer {
    private int age;

    @JsonField("writerName")
    private String name;

    @JsonField
    private String bookName;

    public Writer(int age, String name, String bookName) {
        this.age = age;
        this.name = name;
        this.bookName = bookName;
    }

    // getter / setter

    @Override
    public String toString() {
        return "Writer{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", bookName='" + bookName + '\'' +
                '}';
    }
}

1) ИМЯ@JsonFieldАннотация предоставляет явное строковое значение.

2) на имя книги@JsonFieldВ аннотации используется элемент по умолчанию.

Далее давайте напишем класс сериализатора JsonSerializer следующим образом:

public class JsonSerializer {
    public static String serialize(Object object) throws IllegalAccessException {
        Class<?> objectClass = object.getClass();
        Map<String, String> jsonElements = new HashMap<>();
        for (Field field : objectClass.getDeclaredFields()) {
            field.setAccessible(true);
            if (field.isAnnotationPresent(JsonField.class)) {
                jsonElements.put(getSerializedKey(field), (String) field.get(object));
            }
        }
        return toJsonString(jsonElements);
    }

    private static String getSerializedKey(Field field) {
        String annotationValue = field.getAnnotation(JsonField.class).value();
        if (annotationValue.isEmpty()) {
            return field.getName();
        } else {
            return annotationValue;
        }
    }

    private static String toJsonString(Map<String, String> jsonMap) {
        String elementsString = jsonMap.entrySet()
                .stream()
                .map(entry -> "\"" + entry.getKey() + "\":\"" + entry.getValue() + "\"")
                .collect(Collectors.joining(","));
        return "{" + elementsString + "}";
    }
}

Класса JsonSerializer может показаться много, но не бойтесь, я буду объяснять его понемногу, пока вы не разберетесь.

1)serialize()Метод используется для сериализации объектов, он получает параметр типа Object.objectClass.getDeclaredFields()Получите все поля, объявленные объектом, посредством отражения, а затем выполните обход цикла for. В цикле for первый проходfield.setAccessible(true)Установите доступность отраженного объекта в true для сериализации (если такого шага нет, приватное поле не может быть получено, и будет выброшено исключение IllegalAccessException); затем пройтиisAnnotationPresent()Определить, оформлено ли полеJsonFieldаннотация, если да, звонитеgetSerializedKey()метод и получите значение, представленное этим полем в этом объекте, и поместите его в jsonElements.

2)getSerializedKey()Метод используется для получения значения аннотации в поле, и если значение аннотации пусто, вернуть имя поля.

3)toJsonString()Метод возвращает отформатированную строку JSON с помощью Stream. Если вы новичок в Stream, пожалуйста, обратитесь к тому, что я написал ранееНачало работы с потоком.

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

Далее напишем тестовый класс JsonFieldTest следующего содержания:

public class JsonFieldTest {
    public static void main(String[] args) throws IllegalAccessException {
        Writer cmower = new Writer(18,"沉默王二","Web全栈开发进阶之路");
        System.out.println(JsonSerializer.serialize(cmower));
    }
}

Вывод программы следующий:

{"bookName":"Web全栈开发进阶之路","writerName":"沉默王二"}

С точки зрения результатов:

1) Поле age класса Writer не оформлено@JsonFieldаннотация, поэтому нет сериализации.

2) Поле имени класса Writer оформлено@JsonFieldAnnotation и указана строка "writerName", поэтому после сериализации она становится authorName.

3) Поле bookName класса Writer оформлено@JsonFieldAnnotation, но значение явно не указано, поэтому после сериализации оно остается bookName.

06. Спасибо

Ну что же, мои дорогие читатели, выше все содержание этой статьи, не кажется ли вам нетрудным сделать комментарий? Вы также быстро двигаете руками, чтобы попробовать!Оригинальность непроста, не просите пустой билет, пожалуйста, поставьте лайк этой статье, что будет моей сильнейшей мотивацией писать больше качественных статей.

Если вы считаете, что статья немного полезна для вас, пожалуйста, выполните поиск по запросу "Тихий король 2"Первый раз читаю, отвечаю [666】更有我为你精心准备的 500G 高清教学视频(已分门别类)。 Эта статья GitHubБыл включен, есть большой заводской интервью полный тест, добро пожаловать в STAR.