mirror of
https://github.com/CarmJos/EasyConfiguration.git
synced 2024-09-19 20:25:51 +00:00
[2.2.0] 实现内部静态类的自动注册。
This commit is contained in:
parent
ab2f898164
commit
51c287a0a7
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>2.1.0</version>
|
<version>2.2.0</version>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<properties>
|
<properties>
|
||||||
|
@ -18,18 +18,34 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz, boolean saveDefaults) {
|
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz, boolean saveDefaults) {
|
||||||
initializeClass(clazz, null, null, null, null, saveDefaults);
|
initialize(clazz, saveDefaults, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initialize(@NotNull Class<? extends ConfigurationRoot> clazz,
|
||||||
|
boolean saveDefaults, boolean loadSubClasses) {
|
||||||
|
initializeClass(clazz, null, null, null, null, saveDefaults, loadSubClasses);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initializeClass(@NotNull Class<?> clazz,
|
protected void initializeClass(@NotNull Class<?> clazz,
|
||||||
@Nullable String parentPath, @Nullable String fieldName,
|
@Nullable String parentPath, @Nullable String fieldName,
|
||||||
@Nullable ConfigPath fieldPath, @Nullable ConfigComment filedComments,
|
@Nullable ConfigPath fieldPath, @Nullable ConfigComment filedComments,
|
||||||
boolean saveDefaults) {
|
boolean saveDefaults, boolean loadSubClasses) {
|
||||||
if (!ConfigurationRoot.class.isAssignableFrom(clazz)) return;
|
|
||||||
String path = getClassPath(clazz, parentPath, fieldName, fieldPath);
|
String path = getClassPath(clazz, parentPath, fieldName, fieldPath);
|
||||||
if (path != null) setComments(path, getClassComments(clazz, filedComments));
|
if (path != null) setComments(path, getClassComments(clazz, filedComments));
|
||||||
for (Field field : clazz.getDeclaredFields()) {
|
for (Field field : clazz.getDeclaredFields()) {
|
||||||
initializeField(clazz, field, path, saveDefaults);
|
initializeField(clazz, field, path, saveDefaults, loadSubClasses);
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?>[] classes = clazz.getDeclaredClasses();
|
||||||
|
if (loadSubClasses && classes.length > 0) {
|
||||||
|
// 逆向加载,保持顺序。
|
||||||
|
for (int i = classes.length - 1; i >= 0; i--) {
|
||||||
|
initializeClass(
|
||||||
|
classes[i], path, classes[i].getSimpleName(),
|
||||||
|
null, null,
|
||||||
|
saveDefaults, true
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,8 +55,8 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
value.initialize(provider, saveDefaults, path, comments);
|
value.initialize(provider, saveDefaults, path, comments);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeField(@NotNull Class<?> source, @NotNull Field field,
|
private void initializeField(@NotNull Class<?> source, @NotNull Field field, @Nullable String parent,
|
||||||
@Nullable String parent, boolean saveDefaults) {
|
boolean saveDefaults, boolean loadSubClasses) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
@ -55,7 +71,7 @@ public class ConfigInitializer<T extends ConfigurationProvider<?>> {
|
|||||||
(Class<?>) object, parent, field.getName(),
|
(Class<?>) object, parent, field.getName(),
|
||||||
field.getAnnotation(ConfigPath.class),
|
field.getAnnotation(ConfigPath.class),
|
||||||
field.getAnnotation(ConfigComment.class),
|
field.getAnnotation(ConfigComment.class),
|
||||||
saveDefaults
|
saveDefaults, loadSubClasses
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
} catch (IllegalAccessException ignored) {
|
} catch (IllegalAccessException ignored) {
|
||||||
|
@ -5,6 +5,8 @@ import cc.carm.lib.configuration.core.function.ConfigDataFunction;
|
|||||||
import cc.carm.lib.configuration.core.value.type.ConfiguredList;
|
import cc.carm.lib.configuration.core.value.type.ConfiguredList;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, SourceListBuilder<S, V>> {
|
public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, SourceListBuilder<S, V>> {
|
||||||
@ -30,6 +32,11 @@ public class SourceListBuilder<S, V> extends CommonConfigBuilder<List<V>, Source
|
|||||||
this.valueSerializer = valueSerializer;
|
this.valueSerializer = valueSerializer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SafeVarargs
|
||||||
|
public final @NotNull SourceListBuilder<S, V> defaults(@NotNull V... values) {
|
||||||
|
return defaults(new ArrayList<>(Arrays.asList(values)));
|
||||||
|
}
|
||||||
|
|
||||||
public @NotNull SourceListBuilder<S, V> parseSource(ConfigDataFunction<Object, S> sourceParser) {
|
public @NotNull SourceListBuilder<S, V> parseSource(ConfigDataFunction<Object, S> sourceParser) {
|
||||||
this.sourceParser = sourceParser;
|
this.sourceParser = sourceParser;
|
||||||
return this;
|
return this;
|
||||||
|
@ -41,4 +41,8 @@ public abstract class ConfigurationProvider<W extends ConfigurationWrapper> {
|
|||||||
getInitializer().initialize(configClazz, saveDefaults);
|
getInitializer().initialize(configClazz, saveDefaults);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void initialize(Class<? extends ConfigurationRoot> configClazz, boolean saveDefaults, boolean loadSubClasses) {
|
||||||
|
getInitializer().initialize(configClazz, saveDefaults, loadSubClasses);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>2.1.0</version>
|
<version>2.2.0</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<version>2.1.0</version>
|
<version>2.2.0</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package config.source;
|
package config.source;
|
||||||
|
|
||||||
|
import cc.carm.lib.configuration.core.ConfigInitializer;
|
||||||
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
import cc.carm.lib.configuration.core.ConfigurationRoot;
|
||||||
import cc.carm.lib.configuration.core.annotation.ConfigComment;
|
import cc.carm.lib.configuration.core.annotation.ConfigComment;
|
||||||
import cc.carm.lib.configuration.core.annotation.ConfigPath;
|
import cc.carm.lib.configuration.core.annotation.ConfigPath;
|
||||||
@ -26,13 +27,15 @@ public class DemoConfiguration extends ConfigurationRoot {
|
|||||||
protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D);
|
protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D);
|
||||||
|
|
||||||
|
|
||||||
|
// 支持通过 Class<?> 变量标注子配置,一并注册。
|
||||||
// 注意: 若对应类也有注解,则优先使用类的注解。
|
// 注意: 若对应类也有注解,则优先使用类的注解。
|
||||||
@ConfigPath("impl-test") //支持通过注解修改子配置的主路径,若不修改则以变量名自动生成。
|
@ConfigPath("impl-test") //支持通过注解修改子配置的主路径,若不修改则以变量名自动生成。
|
||||||
@ConfigComment("Something...") // 支持给子路径直接打注释
|
@ConfigComment("Something...") // 支持给子路径直接打注释
|
||||||
public static final Class<?> IMPL = ImplConfiguration.class;
|
public static final Class<?> IMPL = ImplConfiguration.class;
|
||||||
|
|
||||||
// 可以直接写静态内部类,并通过 Class<?> 声明。
|
// 子配置文件
|
||||||
public static final Class<?> SUB_TEST = Sub.class;
|
@ConfigPath("database")
|
||||||
|
public static final Class<?> DB_CONFIG = DatabaseConfiguration.class;
|
||||||
|
|
||||||
@ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。
|
@ConfigPath("user") // 通过注解规定配置文件中的路径,若不进行注解则以变量名自动生成。
|
||||||
@ConfigComment({"Section类型数据测试"}) // 通过注解给配置添加注释。
|
@ConfigComment({"Section类型数据测试"}) // 通过注解给配置添加注释。
|
||||||
@ -42,10 +45,6 @@ public class DemoConfiguration extends ConfigurationRoot {
|
|||||||
.parseValue((section, defaultValue) -> TestModel.deserialize(section))
|
.parseValue((section, defaultValue) -> TestModel.deserialize(section))
|
||||||
.serializeValue(TestModel::serialize).build();
|
.serializeValue(TestModel::serialize).build();
|
||||||
|
|
||||||
// 子配置文件
|
|
||||||
@ConfigPath("database")
|
|
||||||
public static final Class<?> DB_CONFIG = DatabaseConfiguration.class;
|
|
||||||
|
|
||||||
@ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"})
|
@ConfigComment({"[ID-UUID] 对照表", "", "用于测试Map类型的解析与序列化保存"})
|
||||||
public static final ConfigValue<Map<Integer, UUID>> USERS = ConfiguredMap
|
public static final ConfigValue<Map<Integer, UUID>> USERS = ConfiguredMap
|
||||||
.builder(Integer.class, UUID.class).fromString()
|
.builder(Integer.class, UUID.class).fromString()
|
||||||
@ -54,6 +53,10 @@ public class DemoConfiguration extends ConfigurationRoot {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支持内部类的直接注册。
|
||||||
|
* 注意,需要使用 {@link ConfigInitializer#initialize(Class, boolean, boolean)} 方法,并设定第三个参数为 true。
|
||||||
|
*/
|
||||||
public static class Sub extends ConfigurationRoot {
|
public static class Sub extends ConfigurationRoot {
|
||||||
|
|
||||||
@ConfigPath(value = "uuid-value", root = true)
|
@ConfigPath(value = "uuid-value", root = true)
|
||||||
@ -62,8 +65,6 @@ public class DemoConfiguration extends ConfigurationRoot {
|
|||||||
.parseValue((data, defaultValue) -> UUID.fromString(data))
|
.parseValue((data, defaultValue) -> UUID.fromString(data))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
public static final Class<?> NOTHING = Sub.That.class;
|
|
||||||
|
|
||||||
public static class That extends ConfigurationRoot {
|
public static class That extends ConfigurationRoot {
|
||||||
|
|
||||||
public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList
|
public static final ConfigValue<List<UUID>> OPERATORS = ConfiguredList
|
||||||
|
2
pom.xml
2
pom.xml
@ -15,7 +15,7 @@
|
|||||||
<groupId>cc.carm.lib</groupId>
|
<groupId>cc.carm.lib</groupId>
|
||||||
<artifactId>easyconfiguration-parent</artifactId>
|
<artifactId>easyconfiguration-parent</artifactId>
|
||||||
<packaging>pom</packaging>
|
<packaging>pom</packaging>
|
||||||
<version>2.1.0</version>
|
<version>2.2.0</version>
|
||||||
<modules>
|
<modules>
|
||||||
<module>core</module>
|
<module>core</module>
|
||||||
<module>impl/yaml</module>
|
<module>impl/yaml</module>
|
||||||
|
Loading…
Reference in New Issue
Block a user