Существует ли способ передать аннотацию Java в качестве параметра?

Парни являются там способом передать Аннотацию как прямой параметр (скорее путем выполнения всего отражения наверху)? Например, в следующем коде, у меня есть Число аннотации, которое содержит международное значение, я хочу передать в качестве параметра addImpl методу, как я могу сделать это (кроме отражением)?

Фрагмент кода:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD})
public @interface Number {
    int value();
}

public void add(int x2) {
    addImpl(@Number(value = 10) lol, x2);
}

public void addImpl(Number a, int b) {
    System.out.println(a.value() + b);
}

public static void main(String[] args) {
    new TestClass().add(3);
}
26
задан skaffman 19 July 2010 в 15:02
поделиться

4 ответа

Да, вы можете передавать такие аннотации (как если бы они были обычными интерфейсами).

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

import java.lang.annotation.*;

public class Example {

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public static @interface Number {
        int value();
    }

    @Number(value = 42)
    public int adder(final int b) throws SecurityException, NoSuchMethodException {
        Number number = getClass().getMethod("adder", int.class).getAnnotation(Number.class);
        return addImpl(number, b);
    }

    public int addImpl(final Number a, final int b) {
        return a.value() + b;
    }

    public static void main(final String[] args) throws SecurityException, NoSuchMethodException {
        System.out.println(new Example().adder(0));
    }
}
21
ответ дан 28 November 2019 в 07:31
поделиться

Number - это тоже старый добрый интерфейс, вы можете реализовать конкретный класс.

Ребят, это пригодится. Хотя модуль в основном имеет дело с аннотациями, которые фиксируются во время компиляции, иногда нам нужно скормить ему другую информацию, полученную во время выполнения из других источников (например, xml, gush!). Мы можем перестроить эту вещь или просто создать среду выполнения. объект типа аннотации.

2
ответ дан 28 November 2019 в 07:31
поделиться

Насколько мне известно, не существует такой вещи, как "литерал аннотации", который вы хотите использовать в своей реализации add .

Я думаю, что наиболее близким к этому было бы объявление метода, принимающего параметр типа java.lang.annotation.Annotation , но тогда вам все равно нужно будет получить эти экземпляры через отражение из объекты класса / метода.

4
ответ дан 28 November 2019 в 07:31
поделиться

Вы можете сделать это следующим образом:

public void add(int x2) {
    addImpl(new Number() {

        @Override
        public int value() {
            return 10;
        }

        @Override
        public Class<? extends Annotation> annotationType() {
            return Number.class;
        }
    }, x2);
}

Поскольку Number в основном является интерфейсом, вам нужно создать экземпляр анонимного класса, реализующего этот интерфейс, и передать его методу.

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

9
ответ дан 28 November 2019 в 07:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: