mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2026-06-04 18:48:20 +08:00
feat(init): 支持针对于实体类的初始化 #9
This commit is contained in:
@@ -46,7 +46,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
*/
|
*/
|
||||||
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz,
|
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz,
|
||||||
boolean saveDefaults, boolean loadSubClasses) {
|
boolean saveDefaults, boolean loadSubClasses) {
|
||||||
initializeClass(
|
initializeStaticClass(
|
||||||
clazz, null, null,
|
clazz, null, null,
|
||||||
null, null, null,
|
null, null, null,
|
||||||
saveDefaults, loadSubClasses
|
saveDefaults, loadSubClasses
|
||||||
@@ -76,7 +76,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
* @param saveDefaults 是否写入默认值(默认为 true)。
|
* @param saveDefaults 是否写入默认值(默认为 true)。
|
||||||
*/
|
*/
|
||||||
public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) {
|
public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) {
|
||||||
initializeClass(
|
initializeInstance(
|
||||||
config, null, null,
|
config, null, null,
|
||||||
null, null, null,
|
null, null, null,
|
||||||
saveDefaults
|
saveDefaults
|
||||||
@@ -90,7 +90,9 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initializeClass(@NotNull ConfigurationRoot root,
|
|
||||||
|
// 针对实例类的初始化方法
|
||||||
|
private void initializeInstance(@NotNull ConfigurationRoot root,
|
||||||
@Nullable String parentPath, @Nullable String fieldName,
|
@Nullable String parentPath, @Nullable String fieldName,
|
||||||
@Nullable ConfigPath fieldPath,
|
@Nullable ConfigPath fieldPath,
|
||||||
@Nullable HeaderComment fieldHeaderComments,
|
@Nullable HeaderComment fieldHeaderComments,
|
||||||
@@ -101,11 +103,12 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments));
|
if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments));
|
||||||
|
|
||||||
for (Field field : root.getClass().getDeclaredFields()) {
|
for (Field field : root.getClass().getDeclaredFields()) {
|
||||||
initializeField(root, field, path, saveDefaults);
|
initializeField(root, field, path, saveDefaults, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initializeClass(@NotNull Class<?> clazz,
|
// 针对静态类的初始化方法
|
||||||
|
private void initializeStaticClass(@NotNull Class<?> clazz,
|
||||||
@Nullable String parentPath, @Nullable String fieldName,
|
@Nullable String parentPath, @Nullable String fieldName,
|
||||||
@Nullable ConfigPath fieldPath,
|
@Nullable ConfigPath fieldPath,
|
||||||
@Nullable HeaderComment fieldHeaderComments,
|
@Nullable HeaderComment fieldHeaderComments,
|
||||||
@@ -123,7 +126,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
if (!loadSubClasses) return;
|
if (!loadSubClasses) return;
|
||||||
Class<?>[] classes = clazz.getDeclaredClasses();
|
Class<?>[] classes = clazz.getDeclaredClasses();
|
||||||
for (int i = classes.length - 1; i >= 0; i--) { // 逆向加载,保持顺序。
|
for (int i = classes.length - 1; i >= 0; i--) { // 逆向加载,保持顺序。
|
||||||
initializeClass(
|
initializeStaticClass(
|
||||||
classes[i], path, classes[i].getSimpleName(),
|
classes[i], path, classes[i].getSimpleName(),
|
||||||
null, null, null,
|
null, null, null,
|
||||||
saveDefaults, true
|
saveDefaults, true
|
||||||
@@ -131,12 +134,12 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeField(@NotNull ConfigurationRoot root,
|
private void initializeField(@NotNull Object source, @NotNull Field field,
|
||||||
@NotNull Field field, @Nullable String parent,
|
@Nullable String parent, boolean saveDefaults, boolean loadSubClasses) {
|
||||||
boolean saveDefaults) {
|
|
||||||
try {
|
try {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
Object object = field.get(root);
|
Object object = field.get(source);
|
||||||
|
|
||||||
if (object instanceof ConfigValue<?>) {
|
if (object instanceof ConfigValue<?>) {
|
||||||
initializeValue(
|
initializeValue(
|
||||||
(ConfigValue<?>) object, getFieldPath(field, parent),
|
(ConfigValue<?>) object, getFieldPath(field, parent),
|
||||||
@@ -144,33 +147,18 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
field.getAnnotation(InlineComment.class),
|
field.getAnnotation(InlineComment.class),
|
||||||
saveDefaults
|
saveDefaults
|
||||||
);
|
);
|
||||||
} else if (object instanceof ConfigurationRoot) {
|
} else if (source instanceof ConfigurationRoot && object instanceof ConfigurationRoot) {
|
||||||
initializeClass(
|
// 当且仅当 源字段与字段 均为ConfigurationRoot实例时,才对目标字段进行下一步初始化加载。
|
||||||
|
initializeInstance(
|
||||||
(ConfigurationRoot) object, parent, field.getName(),
|
(ConfigurationRoot) object, parent, field.getName(),
|
||||||
field.getAnnotation(ConfigPath.class),
|
field.getAnnotation(ConfigPath.class),
|
||||||
field.getAnnotation(HeaderComment.class),
|
field.getAnnotation(HeaderComment.class),
|
||||||
field.getAnnotation(InlineComment.class),
|
field.getAnnotation(InlineComment.class),
|
||||||
saveDefaults
|
saveDefaults
|
||||||
);
|
);
|
||||||
}
|
} else if (source instanceof Class<?> && object instanceof Class<?>) {
|
||||||
} catch (IllegalAccessException ignored) {
|
// 当且仅当 源字段与字段 均为静态类时,才对目标字段进行下一步初始化加载。
|
||||||
}
|
initializeStaticClass(
|
||||||
}
|
|
||||||
|
|
||||||
private void initializeField(@NotNull Class<?> source, @NotNull Field field, @Nullable String parent,
|
|
||||||
boolean saveDefaults, boolean loadSubClasses) {
|
|
||||||
try {
|
|
||||||
field.setAccessible(true);
|
|
||||||
Object object = field.get(source);
|
|
||||||
if (object instanceof ConfigValue<?>) {
|
|
||||||
initializeValue(
|
|
||||||
(ConfigValue<?>) object, getFieldPath(field, parent),
|
|
||||||
field.getAnnotation(HeaderComment.class),
|
|
||||||
field.getAnnotation(InlineComment.class),
|
|
||||||
saveDefaults
|
|
||||||
);
|
|
||||||
} else if (object instanceof Class<?>) {
|
|
||||||
initializeClass(
|
|
||||||
(Class<?>) object, parent, field.getName(),
|
(Class<?>) object, parent, field.getName(),
|
||||||
field.getAnnotation(ConfigPath.class),
|
field.getAnnotation(ConfigPath.class),
|
||||||
field.getAnnotation(HeaderComment.class),
|
field.getAnnotation(HeaderComment.class),
|
||||||
@@ -178,6 +166,11 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
saveDefaults, loadSubClasses
|
saveDefaults, loadSubClasses
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 以上判断实现以下规范:
|
||||||
|
// - 实例类中仅加载 ConfigValue实例 与 ConfigurationRoot实例
|
||||||
|
// - 静态类中仅加载 静态ConfigValue实例 与 静态ConfigurationRoot类
|
||||||
|
|
||||||
} catch (IllegalAccessException ignored) {
|
} catch (IllegalAccessException ignored) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user