From 8eefba5159c67d404f40cfbb7ace1d727ba5f8d8 Mon Sep 17 00:00:00 2001 From: carm Date: Sun, 11 Dec 2022 02:17:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(init):=20=E6=94=AF=E6=8C=81=E9=92=88?= =?UTF-8?q?=E5=AF=B9=E4=BA=8E=E5=AE=9E=E4=BD=93=E7=B1=BB=E7=9A=84=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=20#9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/core/ConfigInitializer.java | 75 +++++++++---------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java index ed80512..623746a 100644 --- a/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java +++ b/core/src/main/java/cc/carm/lib/configuration/core/ConfigInitializer.java @@ -46,7 +46,7 @@ public class ConfigInitializer> { */ public void initialize(@NotNull Class clazz, boolean saveDefaults, boolean loadSubClasses) { - initializeClass( + initializeStaticClass( clazz, null, null, null, null, null, saveDefaults, loadSubClasses @@ -76,7 +76,7 @@ public class ConfigInitializer> { * @param saveDefaults 是否写入默认值(默认为 true)。 */ public void initialize(@NotNull ConfigurationRoot config, boolean saveDefaults) { - initializeClass( + initializeInstance( config, null, null, null, null, null, saveDefaults @@ -90,27 +90,30 @@ public class ConfigInitializer> { } } - protected void initializeClass(@NotNull ConfigurationRoot root, - @Nullable String parentPath, @Nullable String fieldName, - @Nullable ConfigPath fieldPath, - @Nullable HeaderComment fieldHeaderComments, - @Nullable InlineComment fieldInlineComments, - boolean saveDefaults) { + + // 针对实例类的初始化方法 + private void initializeInstance(@NotNull ConfigurationRoot root, + @Nullable String parentPath, @Nullable String fieldName, + @Nullable ConfigPath fieldPath, + @Nullable HeaderComment fieldHeaderComments, + @Nullable InlineComment fieldInlineComments, + boolean saveDefaults) { String path = getClassPath(root.getClass(), parentPath, fieldName, fieldPath); this.provider.setHeaderComment(path, getClassHeaderComments(root.getClass(), fieldHeaderComments)); if (path != null) this.provider.setInlineComment(path, readInlineComments(fieldInlineComments)); for (Field field : root.getClass().getDeclaredFields()) { - initializeField(root, field, path, saveDefaults); + initializeField(root, field, path, saveDefaults, false); } } - protected void initializeClass(@NotNull Class clazz, - @Nullable String parentPath, @Nullable String fieldName, - @Nullable ConfigPath fieldPath, - @Nullable HeaderComment fieldHeaderComments, - @Nullable InlineComment fieldInlineComments, - boolean saveDefaults, boolean loadSubClasses) { + // 针对静态类的初始化方法 + private void initializeStaticClass(@NotNull Class clazz, + @Nullable String parentPath, @Nullable String fieldName, + @Nullable ConfigPath fieldPath, + @Nullable HeaderComment fieldHeaderComments, + @Nullable InlineComment fieldInlineComments, + boolean saveDefaults, boolean loadSubClasses) { if (!ConfigurationRoot.class.isAssignableFrom(clazz)) return; // 只解析继承了 ConfigurationRoot 的类 String path = getClassPath(clazz, parentPath, fieldName, fieldPath); this.provider.setHeaderComment(path, getClassHeaderComments(clazz, fieldHeaderComments)); @@ -123,7 +126,7 @@ public class ConfigInitializer> { if (!loadSubClasses) return; Class[] classes = clazz.getDeclaredClasses(); for (int i = classes.length - 1; i >= 0; i--) { // 逆向加载,保持顺序。 - initializeClass( + initializeStaticClass( classes[i], path, classes[i].getSimpleName(), null, null, null, saveDefaults, true @@ -131,12 +134,12 @@ public class ConfigInitializer> { } } - private void initializeField(@NotNull ConfigurationRoot root, - @NotNull Field field, @Nullable String parent, - boolean saveDefaults) { + private void initializeField(@NotNull Object source, @NotNull Field field, + @Nullable String parent, boolean saveDefaults, boolean loadSubClasses) { try { field.setAccessible(true); - Object object = field.get(root); + Object object = field.get(source); + if (object instanceof ConfigValue) { initializeValue( (ConfigValue) object, getFieldPath(field, parent), @@ -144,33 +147,18 @@ public class ConfigInitializer> { field.getAnnotation(InlineComment.class), saveDefaults ); - } else if (object instanceof ConfigurationRoot) { - initializeClass( + } else if (source instanceof ConfigurationRoot && object instanceof ConfigurationRoot) { + // 当且仅当 源字段与字段 均为ConfigurationRoot实例时,才对目标字段进行下一步初始化加载。 + initializeInstance( (ConfigurationRoot) object, parent, field.getName(), field.getAnnotation(ConfigPath.class), field.getAnnotation(HeaderComment.class), field.getAnnotation(InlineComment.class), saveDefaults ); - } - } catch (IllegalAccessException ignored) { - } - } - - 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( + } else if (source instanceof Class && object instanceof Class) { + // 当且仅当 源字段与字段 均为静态类时,才对目标字段进行下一步初始化加载。 + initializeStaticClass( (Class) object, parent, field.getName(), field.getAnnotation(ConfigPath.class), field.getAnnotation(HeaderComment.class), @@ -178,6 +166,11 @@ public class ConfigInitializer> { saveDefaults, loadSubClasses ); } + + // 以上判断实现以下规范: + // - 实例类中仅加载 ConfigValue实例 与 ConfigurationRoot实例 + // - 静态类中仅加载 静态ConfigValue实例 与 静态ConfigurationRoot类 + } catch (IllegalAccessException ignored) { } }