Browse Source

support alias annotation

Looly 5 years ago
parent
commit
623d5ef5c9

+ 3 - 0
CHANGELOG.md

@@ -6,6 +6,9 @@
 ## 5.1.6
 
 ### 新特性
+* 【core  】     NumberUtil.decimalFormat增加Object对象参数支持
+* 【core  】     增加ReflectUtil.getFieldValue支持Alias注解
+
 ### Bug修复
 
 -------------------------------------------------------------------------------------------------------------

+ 6 - 0
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();
 }

+ 12 - 1
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();
 		}
 

+ 14 - 15
hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java

@@ -1,26 +1,11 @@
 package cn.hutool.core.bean;
 
-import java.beans.BeanInfo;
-import java.beans.IntrospectionException;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.beans.PropertyEditor;
-import java.beans.PropertyEditorManager;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.Collection;
-import java.util.HashMap;
-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;
@@ -31,6 +16,20 @@ 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;
+import java.beans.PropertyDescriptor;
+import java.beans.PropertyEditor;
+import java.beans.PropertyEditorManager;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * Bean工具类
  *

+ 23 - 0
hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java

@@ -1022,6 +1022,29 @@ public class NumberUtil {
 	}
 
 	/**
+	 * 格式化double<br>
+	 * 对 {@link DecimalFormat} 做封装<br>
+	 *
+	 * @param pattern 格式 格式中主要以 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。<br>
+	 *                <ul>
+	 *                <li>0 =》 取一位整数</li>
+	 *                <li>0.00 =》 取一位整数和两位小数</li>
+	 *                <li>00.000 =》 取两位整数和三位小数</li>
+	 *                <li># =》 取所有整数部分</li>
+	 *                <li>#.##% =》 以百分比方式计数,并取两位小数</li>
+	 *                <li>#.#####E0 =》 显示为科学计数法,并取五位小数</li>
+	 *                <li>,### =》 每三位以逗号进行分隔,例如:299,792,458</li>
+	 *                <li>光速大小为每秒,###米 =》 将格式嵌入文本</li>
+	 *                </ul>
+	 * @param value   值,支持BigDecimal、BigInteger、Number等类型
+	 * @return 格式化后的值
+	 * @since 5.1.6
+	 */
+	public static String decimalFormat(String pattern, Object value) {
+		return new DecimalFormat(pattern).format(value);
+	}
+
+	/**
 	 * 格式化金额输出,每三位用逗号分隔
 	 *
 	 * @param value 金额

+ 20 - 0
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;
@@ -117,6 +118,25 @@ public class ReflectUtil {
 	}
 
 	/**
+	 * 获取字段名,如果存在{@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类的字段, 字段不存在则返回<code>null</code>
 	 *
 	 * @param beanClass 被查找字段的类,不能为null

+ 3 - 4
hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java

@@ -1,12 +1,11 @@
 package cn.hutool.core.util;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-
-import cn.hutool.core.lang.Console;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
 /**
  * {@link NumberUtil} 单元测试类
  * 

+ 3 - 3
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);
 		}

+ 1 - 1
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 -> {