Парни являются там способом передать Аннотацию как прямой параметр (скорее путем выполнения всего отражения наверху)? Например, в следующем коде, у меня есть Число аннотации, которое содержит международное значение, я хочу передать в качестве параметра 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);
}
Да, вы можете передавать такие аннотации (как если бы они были обычными интерфейсами).
Единственное, что вы не можете сделать, - это создавать экземпляры этого интерфейса во время выполнения. Вы можете только взять существующие аннотации и передать их.
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));
}
}
Number - это тоже старый добрый интерфейс, вы можете реализовать конкретный класс.
Ребят, это пригодится. Хотя модуль в основном имеет дело с аннотациями, которые фиксируются во время компиляции, иногда нам нужно скормить ему другую информацию, полученную во время выполнения из других источников (например, xml, gush!). Мы можем перестроить эту вещь или просто создать среду выполнения. объект типа аннотации.
Насколько мне известно, не существует такой вещи, как "литерал аннотации", который вы хотите использовать в своей реализации add
.
Я думаю, что наиболее близким к этому было бы объявление метода, принимающего параметр типа java.lang.annotation.Annotation , но тогда вам все равно нужно будет получить эти экземпляры через отражение из объекты класса / метода.
Вы можете сделать это следующим образом:
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 в основном является интерфейсом, вам нужно создать экземпляр анонимного класса, реализующего этот интерфейс, и передать его методу.
Хотя почему ты хочешь это сделать, я не знаю. Если вам нужно передать значение чему-либо, вы должны действительно использовать класс.