From 623d5ef5c91602f2aaa65d18d74b7e9ebab6ba50 Mon Sep 17 00:00:00 2001 From: Looly Date: Fri, 28 Feb 2020 23:50:28 +0800 Subject: [PATCH] support alias annotation --- CHANGELOG.md | 3 ++ .../java/cn/hutool/core/annotation/Alias.java | 6 ++++ .../java/cn/hutool/core/bean/BeanDesc.java | 13 +++++++- .../java/cn/hutool/core/bean/BeanUtil.java | 33 +++++++++---------- .../java/cn/hutool/core/util/NumberUtil.java | 23 +++++++++++++ .../java/cn/hutool/core/util/ReflectUtil.java | 20 +++++++++++ .../cn/hutool/core/util/NumberUtilTest.java | 7 ++-- .../java/cn/hutool/json/InternalJSONUtil.java | 6 ++-- .../cn/hutool/json/CustomSerializeTest.java | 2 +- 9 files changed, 87 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcd82df10..9acdb6a36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ ## 5.1.6 ### 新特性 +* 【core 】 NumberUtil.decimalFormat增加Object对象参数支持 +* 【core 】 增加ReflectUtil.getFieldValue支持Alias注解 + ### Bug修复 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/annotation/Alias.java b/hutool-core/src/main/java/cn/hutool/core/annotation/Alias.java index 9c98d8efa..4ed9bb07e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/annotation/Alias.java +++ b/hutool-core/src/main/java/cn/hutool/core/annotation/Alias.java @@ -16,5 +16,11 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) public @interface Alias { + + /** + * 别名值,即使用此注解要替换成的别名名称 + * + * @return 别名值 + */ String value(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java index 86e79ce71..3e485b450 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanDesc.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; +import cn.hutool.core.annotation.Alias; import cn.hutool.core.lang.Assert; import cn.hutool.core.map.CaseInsensitiveMap; import cn.hutool.core.util.BooleanUtil; @@ -321,11 +322,21 @@ public class BeanDesc implements Serializable{ } /** - * 获取字段名 + * 获取字段名,如果存在{@link Alias}注解,读取注解的值作为名称 * * @return 字段名 */ public String getFieldName() { + return ReflectUtil.getFieldName(this.field); + } + + /** + * 获取字段名称 + * + * @return 字段名 + * @since 5.1.6 + */ + public String getRawFieldName() { return null == this.field ? null : this.field.getName(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index 27dbf4728..f328267db 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -1,5 +1,21 @@ package cn.hutool.core.bean; +import cn.hutool.core.bean.BeanDesc.PropDesc; +import cn.hutool.core.bean.copier.BeanCopier; +import cn.hutool.core.bean.copier.CopyOptions; +import cn.hutool.core.bean.copier.ValueProvider; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.lang.Editor; +import cn.hutool.core.lang.Filter; +import cn.hutool.core.map.CaseInsensitiveMap; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ClassUtil; +import cn.hutool.core.util.ModifierUtil; +import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; + import java.beans.BeanInfo; import java.beans.IntrospectionException; import java.beans.Introspector; @@ -14,23 +30,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import cn.hutool.core.bean.BeanDesc.PropDesc; -import cn.hutool.core.bean.copier.BeanCopier; -import cn.hutool.core.bean.copier.CopyOptions; -import cn.hutool.core.bean.copier.ValueProvider; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.lang.Console; -import cn.hutool.core.lang.Editor; -import cn.hutool.core.lang.Filter; -import cn.hutool.core.map.CaseInsensitiveMap; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ClassUtil; -import cn.hutool.core.util.ModifierUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; - /** * Bean工具类 * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java index cd0ab0222..09b4feb9f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java @@ -1021,6 +1021,29 @@ public class NumberUtil { return new DecimalFormat(pattern).format(value); } + /** + * 格式化double
+ * 对 {@link DecimalFormat} 做封装
+ * + * @param pattern 格式 格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。
+ * + * @param value 值,支持BigDecimal、BigInteger、Number等类型 + * @return 格式化后的值 + * @since 5.1.6 + */ + public static String decimalFormat(String pattern, Object value) { + return new DecimalFormat(pattern).format(value); + } + /** * 格式化金额输出,每三位用逗号分隔 * diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 085431ddf..8ea51107b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -1,5 +1,6 @@ package cn.hutool.core.util; +import cn.hutool.core.annotation.Alias; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.exceptions.UtilException; @@ -116,6 +117,25 @@ public class ReflectUtil { return null != getField(beanClass, name); } + /** + * 获取字段名,如果存在{@link Alias}注解,读取注解的值作为名称 + * + * @return 字段名 + * @since 5.1.6 + */ + public static String getFieldName(Field field) { + if (null == field) { + return null; + } + + final Alias alias = field.getAnnotation(Alias.class); + if (null != alias) { + return alias.value(); + } + + return field.getName(); + } + /** * 查找指定类中的所有字段(包括非public字段),也包括父类和Object类的字段, 字段不存在则返回null * diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java index 14060cc47..13ed9740c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java @@ -1,12 +1,11 @@ package cn.hutool.core.util; +import org.junit.Assert; +import org.junit.Test; + import java.math.BigDecimal; import java.math.RoundingMode; -import cn.hutool.core.lang.Console; -import org.junit.Assert; -import org.junit.Test; - /** * {@link NumberUtil} 单元测试类 * diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index a1b50f084..4c55a0ccd 100644 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -55,13 +55,13 @@ final class InternalJSONUtil { } else if (value instanceof Boolean) { writer.write(value.toString()); } else if (value instanceof JSONString) { - Object o; + String valueStr; try { - o = ((JSONString) value).toJSONString(); + valueStr = ((JSONString) value).toJSONString(); } catch (Exception e) { throw new JSONException(e); } - writer.write(o != null ? o.toString() : JSONUtil.quote(value.toString())); + writer.write(valueStr != null ? valueStr : JSONUtil.quote(value.toString())); } else { JSONUtil.quote(value.toString(), writer); } diff --git a/hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java b/hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java index 5ebe9f333..18e46d590 100644 --- a/hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/CustomSerializeTest.java @@ -19,7 +19,7 @@ public class CustomSerializeTest { JSONObject obj = JSONUtil.parseObj(customBean); Assert.assertEquals("testName", obj.getStr("customName")); } - + @Test public void deserializeTest() { JSONUtil.putDeserializer(CustomBean.class, json -> {