Обучение и трудоустройство Java-программистов от Junior до Senior

Зачем применять рефлексию, аннотации?

 
 
 
Сообщения:1
Здравствуйте. Помогите уяснить.
К примеру, одно из частных определений рефлексии говорит: "Рефлексия - это инструмент с помощью которого можно узнать всю информацию о классе: имена методов, параметры, поля, аннотации....".
У меня, как у новичка, возникает резонный вопрос, зачем мне эту информацию узнавать, если классы, методы, поля и т.д. я пишу сам и всё про них знаю?))
Понимаю, что используется рефлексия не для своих классов и т.д., но не могу найти реальный пример, который был бы понятен новичку: в какой ситуации я столкнусь с тем, что не буду знать имя класса, метода и т.д.?
То же самое с аннотациями: "...средство, позволяющее встраивать справочную информацию в исходные файлы......". Ну встрою я её, ну а профит какой, что я в итоге с помощью этого получу? Какие плюшки для разработчика появятся при наличии аннотаций? Как они способны облегчить жизнь?
 
 
Сообщения:775
Приветствую!

Вот как раз-таки новичку и не надо пока знать что такое рефлексия и аннотации. В ООП это зло. :) Посмотрите вот это :)
Изменен:01 дек 2016 07:34
 
 
Сообщения:485
Cenzor:
Какие плюшки для разработчика появятся при наличии аннотаций? Как они способны облегчить жизнь?

Самый простой пример это аннотация Override. Ее использование не даст вам ошибиться при переопределении методов.
 
 
Сообщения:25
Зачем аннотации http://grison.me/2016/09/30/monster-component-java-spring/ ?))

Это конечно шуточный пример, и так писать не нужно.

А если пример, то вот очень наглядный пример:
    @RequestMapping(value = "/api/cats/{id}", method = RequestMethod.GET)
	public Cat restFind(@PathVariable String id) {
		return repository.findOne(id);
	}
 
 
Сообщения:27
Cenzor:
К примеру, одно из частных определений рефлексии говорит: "Рефлексия - это инструмент с помощью которого можно узнать всю информацию о классе: имена методов, параметры, поля, аннотации....".
У меня, как у новичка, возникает резонный вопрос, зачем мне эту информацию узнавать, если классы, методы, поля и т.д. я пишу сам и всё про них знаю?))


Живой пример. Есть много классов, наследников общего предка, и у каждого есть параметры, настраиваемые сеттерами. Например, такие:

 
    private double thresholdLower = 0.1;
    private double thresholdUpper = 0.3;
    private int kernelSizeSobel = 3;

    public double getThresholdLower() {
        return thresholdLower;
    }

    public void setThresholdLower(double thresholdLower) {
        this.thresholdLower = nonNegative(thresholdLower);
    }

    public double getThresholdUpper() {
        return thresholdUpper;
    }

    public void setThresholdUpper(double thresholdUpper) {
        this.thresholdUpper = nonNegative(thresholdUpper);
    }

    public int getKernelSizeSobel() {
        return kernelSizeSobel;
    }

    public void setKernelSizeSobel(int kernelSizeSobel) {
        this.kernelSizeSobel = positive(kernelSizeSobel);
    }


Классов так много, что надо максимально упростить написание сеттеров и проверок параметров на допустимость, благо они однотипные (положительность, неотрицательность, не-null-овость и т.п.) Для этого используются перегруженные методы вроде nonNegative - если параметр некорректный, то он бросает исключение, если корректный, то возвращает его.

Спрашивается, как сформировать сообщение об ошибке? Хотелось бы, чтобы в сообщении было сказано, какой именно параметр неправильный (может быть, мы покажем его пользователю, который не видит всей распечатки стека). Первый вариант, который был реализован вначале: второй параметр метода nonNegative содержит сообщение об ошибке, как в известном Objects.requireNonNull. Но... такого рода сеттеров сотни, и почти наверняка где-нибудь по ошибке напишем не то сообщение (ведь при обычной работе это не проявляется). Во втором варианте сообщение формируется автоматически, а имя параметра вычисляется по имени метода, извлекаемого из стека.

Обычная же рефлексия используется в другом методе, который по имени параметра, взятого из JSON-файла, автоматически отыскивает нужный сеттер и вызывает его.

Проект 8-й День, Израиль, Кармиэль
 
 
Сообщения:458
за два года работы и 9 месяцев практики рефлексию использовал исключительно для тестов, чтоб глянуть, что у класса есть публичный конструктор.

с аннотациями сложнее: у каждого фреймворка они свои и каждая для своего дела. тут не стоИт вопрос - использовать или нет, так-же как не стоИт вопрос - а стОит ли использовать циклы.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет