Получить значение инициализации поля - PullRequest
1 голос
/ 17 октября 2019

Я анализирую определения классов с помощью самоанализа и хотел бы знать, явно ли класс определил значение по умолчанию для некоторых его полей.

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; будет компилироватьне работает).

...