Я много чего перепробовал в сети, но, похоже, у меня ничего не работает.Я хочу знать, был ли метод аннотации @Override
n (либо с тем же значением, что и его default
).
Взгляните на этот пример:
public class AnnoTest {
@Anno
private String something;
public static void main(String[] args) throws NoSuchFieldException, SecurityException, NoSuchMethodException {
Field field = AnnoTest.class.getDeclaredField("something");
field.setAccessible(true);
boolean isDefault= field.getAnnotation(Anno.class).annotationType().getDeclaredMethod("include").isDefault();
System.out.println(isDefault); //returns false
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface Anno {
boolean include() default false;
}
}
Дляпо какой-то причине он возвращает ложь.Когда я изменяю его на:
@Anno(include = false)
private String something;
Возвращает false
снова.Есть ли способ узнать, было ли значение объявлено в аннотации?
Я знаю, что мог бы просто сравнить значение по умолчанию и его текущее значение, но оно не будет работать для меня.Я хочу знать, было ли это объявлено.
Другими словами, мне нужен какой-то магический логический код, который выполняет следующее:
@Anno
private String something;
return false
.
@Anno(include = true)
private String something;
return true
.
@Anno(include = false)
private String something;
return true
.
Причина этого в том, что я хочу добавить метод (к моей аннотации) с именем "parent".Когда родитель (строка) был объявлен аннотацией, это поле будет наследовать аннотацию поля с именем parent.Взгляните на этот пример:
public class AnnoTest {
@Anno(include = false)
private Something something = new Something();
@Anno(parent = "something")
private Something somethingElse = new Something();
public static void main(String[] args) throws NoSuchFieldException, SecurityException, NoSuchMethodException {
AnnoTest test = new AnnoTest();
Field somethingField = AnnoTest.class.getDeclaredField("something");
somethingField.setAccessible(true);
Field somethingElseField = AnnoTest.class.getDeclaredField("somethingElse");
somethingField.setAccessible(true);
Anno anno = somethingElseField.getAnnotation(Anno.class);
if (anno.parent().equals("something")) {
boolean include = somethingField.getAnnotation(Anno.class).include();
test.somethingElse.isIncluded = include;
}
//If not declared it will return true, which it should be false, because "something" field has it false.
boolean include = somethingElseField.getAnnotation(Anno.class).include();
//if somethingElse has declared "include", dominate the value, else keep it from the parent
test.somethingElse.isIncluded = include;
}
public class Something {
boolean isIncluded;
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface Anno {
boolean include() default false;
String parent() default "";
}
}