1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2024-09-20 04:35:51 +00:00

fix(parse): 修复Number基础类型转型丢失的问题。 fix #17

This commit is contained in:
Carm Jos 2022-12-06 21:53:05 +08:00
parent ccd239ad6b
commit 6f97166192
10 changed files with 92 additions and 91 deletions

View File

@ -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>3.2.0</version> <version>3.2.1</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<properties> <properties>

View File

@ -50,6 +50,23 @@ public interface ConfigValueParser<T, R> {
@Contract(pure = true) @Contract(pure = true)
static <V> @NotNull ConfigValueParser<Object, V> castObject(Class<V> valueClass) { static <V> @NotNull ConfigValueParser<Object, V> castObject(Class<V> valueClass) {
return (input, defaultValue) -> { return (input, defaultValue) -> {
if (Number.class.isAssignableFrom(valueClass)) {
if (Long.class.isAssignableFrom(valueClass)) {
input = longValue().parse(input, null);
} else if (Integer.class.isAssignableFrom(valueClass)) {
input = intValue().parse(input, null);
} else if (Float.class.isAssignableFrom(valueClass)) {
input = floatValue().parse(input, null);
} else if (Double.class.isAssignableFrom(valueClass)) {
input = doubleValue().parse(input, null);
} else if (Byte.class.isAssignableFrom(valueClass)) {
input = byteValue().parse(input, null);
} else if (Short.class.isAssignableFrom(valueClass)) {
input = shortValue().parse(input, null);
}
}
if (valueClass.isInstance(input)) return valueClass.cast(input); if (valueClass.isInstance(input)) return valueClass.cast(input);
else throw new IllegalArgumentException("Cannot cast value to " + valueClass.getName()); else throw new IllegalArgumentException("Cannot cast value to " + valueClass.getName());
}; };

View File

@ -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>3.2.0</version> <version>3.2.1</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -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>3.2.0</version> <version>3.2.1</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -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>3.2.0</version> <version>3.2.1</version>
<relativePath>../../pom.xml</relativePath> <relativePath>../../pom.xml</relativePath>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

View File

@ -44,6 +44,12 @@ public class DemoConfigTest {
public static void testDemo() { public static void testDemo() {
System.out.println("----------------------------------------------------"); System.out.println("----------------------------------------------------");
System.out.println("Test Number: ");
System.out.println("before: " + DemoConfiguration.TEST_NUMBER.get());
DemoConfiguration.TEST_NUMBER.set((long) (Long.MAX_VALUE * Math.random()));
System.out.println("after: " + DemoConfiguration.TEST_NUMBER.get());
System.out.println("> Test Value:"); System.out.println("> Test Value:");
System.out.println("before: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get()); System.out.println("before: " + DemoConfiguration.Sub.UUID_CONFIG_VALUE.get());
DemoConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID()); DemoConfiguration.Sub.UUID_CONFIG_VALUE.set(UUID.randomUUID());

View File

@ -1,25 +0,0 @@
package config;
import config.offset.FieldOffset;
import config.offset.OffsetUtil;
import config.source.DemoConfiguration;
import java.util.List;
public class OffsetTest {
// @Test
public void test() {
//
output(OffsetUtil.getClassMemberOffset(DemoConfiguration.class));
output(OffsetUtil.getClassMemberOffset(DemoConfiguration.Sub.class));
}
protected static void output(List<FieldOffset> fieldOffsets) {
for (FieldOffset fieldOffset : fieldOffsets) {
System.out.println(fieldOffset.getOffsetValue() + " -> " + fieldOffset);
}
}
}

View File

@ -1,63 +1,63 @@
package config.offset; //package config.offset;
//
//
import sun.misc.Unsafe; //import sun.misc.Unsafe;
//
import java.lang.reflect.Field; //import java.lang.reflect.Field;
import java.lang.reflect.Modifier; //import java.lang.reflect.Modifier;
import java.util.Collections; //import java.util.Collections;
import java.util.LinkedList; //import java.util.LinkedList;
import java.util.List; //import java.util.List;
//
/** ///**
* @author Chris2018998 // * @author Chris2018998
*/ // */
public class OffsetUtil { //public class OffsetUtil {
private static Unsafe unsafe; // private static Unsafe unsafe;
//
static { // static {
try {
// 获取 Unsafe 内部的私有的实例化单例对象
Field field = Unsafe.class.getDeclaredField("theUnsafe");
// 无视权限
field.setAccessible(true);
unsafe = (Unsafe) field.get(null);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
// try { // try {
// unsafe = AccessController.doPrivileged((PrivilegedExceptionAction<Unsafe>) () -> { // // 获取 Unsafe 内部的私有的实例化单例对象
// Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); // Field field = Unsafe.class.getDeclaredField("theUnsafe");
// theUnsafe.setAccessible(true); // // 无视权限
// return (Unsafe) theUnsafe.get(null); // field.setAccessible(true);
// }); // unsafe = (Unsafe) field.get(null);
// } catch (Throwable e) { // } catch (NoSuchFieldException | IllegalAccessException e) {
// System.err.println("Unable to load unsafe"); // e.printStackTrace();
// } // }
} //// try {
//// unsafe = AccessController.doPrivileged((PrivilegedExceptionAction<Unsafe>) () -> {
public static List<FieldOffset> getClassMemberOffset(Class<?> beanClass) { //// Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
List<FieldOffset> offsetsList = new LinkedList<>(); //// theUnsafe.setAccessible(true);
for (Field field : beanClass.getDeclaredFields()) { //// return (Unsafe) theUnsafe.get(null);
FieldOffset fieldOffset = new FieldOffset(field); //// });
offsetsList.add(fieldOffset); //// } catch (Throwable e) {
if (Modifier.isStatic(field.getModifiers())) //// System.err.println("Unable to load unsafe");
fieldOffset.setOffsetValue(unsafe.staticFieldOffset(field)); //// }
else // }
fieldOffset.setOffsetValue(unsafe.objectFieldOffset(field)); //
Class<?> fieldType = field.getType(); // public static List<FieldOffset> getClassMemberOffset(Class<?> beanClass) {
if (!fieldType.getName().startsWith("java")) { // List<FieldOffset> offsetsList = new LinkedList<>();
Field[] subfields = fieldType.getDeclaredFields(); // for (Field field : beanClass.getDeclaredFields()) {
if (subfields.length > 0) { // FieldOffset fieldOffset = new FieldOffset(field);
fieldOffset.setSubFieldOffsetList(getClassMemberOffset(fieldType)); // offsetsList.add(fieldOffset);
} // if (Modifier.isStatic(field.getModifiers()))
} // fieldOffset.setOffsetValue(unsafe.staticFieldOffset(field));
} // else
// fieldOffset.setOffsetValue(unsafe.objectFieldOffset(field));
Collections.sort(offsetsList); // Class<?> fieldType = field.getType();
return offsetsList; // if (!fieldType.getName().startsWith("java")) {
} // Field[] subfields = fieldType.getDeclaredFields();
// if (subfields.length > 0) {
// fieldOffset.setSubFieldOffsetList(getClassMemberOffset(fieldType));
} // }
// }
// }
//
// Collections.sort(offsetsList);
// return offsetsList;
// }
//
//
//}
//

View File

@ -27,6 +27,9 @@ public class DemoConfiguration extends ConfigurationRoot {
@ConfigPath(root = true) @ConfigPath(root = true)
protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D); protected static final ConfigValue<Double> VERSION = ConfiguredValue.of(Double.class, 1.0D);
@ConfigPath(root = true)
public static final ConfigValue<Long> TEST_NUMBER = ConfiguredValue.of(Long.class, 1000000L);
// 支持通过 Class<?> 变量标注子配置一并注册 // 支持通过 Class<?> 变量标注子配置一并注册
// 注意 若对应类也有注解则优先使用类的注解 // 注意 若对应类也有注解则优先使用类的注解
@ConfigPath("impl-test") //支持通过注解修改子配置的主路径若不修改则以变量名自动生成 @ConfigPath("impl-test") //支持通过注解修改子配置的主路径若不修改则以变量名自动生成

View File

@ -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>3.2.0</version> <version>3.2.1</version>
<modules> <modules>
<module>core</module> <module>core</module>
<module>impl/yaml</module> <module>impl/yaml</module>