Я анализирую определения классов с помощью самоанализа и хотел бы знать, явно ли класс определил значение по умолчанию для некоторых его полей.
class Foo {
private int member = 5; // Init value is 5
}
против
class Foo {
private int member; // Default value is 0 but no init value defined
}
Я мог бы создать экземпляр класса и получить его члены, но я не смог бы различить явно -инициализированные поля, такие как private int member = 0;
и неявно -инициализируется как private int member;
(исходное значение также 0
, за исключением того, что оно не было явно установлено).
Я использую самоанализ через getDeclaredFields()
это означает, что я не могу принять конкретный тип для поля, поэтому я не могу использовать аннотацию, такую как:
@DefaultValue(5)
private int member;
Потому что:
public @interface DefaultValue {
Object value() default null; // Error "... only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof"
}
Я думал об использованииString
в такой аннотации (вместо Object
, который я хотел использовать), затем закодируйте некоторый метод deserialize()
, чтобы проанализировать строку и извлечь значение, но это кажется излишним (если есть более хорошие способы) и не можетпроверяться во время компиляции (например, @DefaultValue("toto") private int member;
будет компилироватьне работает).