support alias annotation

This commit is contained in:
Looly 2020-02-28 23:50:28 +08:00
parent 63e761139b
commit 623d5ef5c9
9 changed files with 87 additions and 26 deletions

View File

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

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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工具类
*

View File

@ -1021,6 +1021,29 @@ public class NumberUtil {
return new DecimalFormat(pattern).format(value);
}
/**
* 格式化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 支持BigDecimalBigIntegerNumber等类型
* @return 格式化后的值
* @since 5.1.6
*/
public static String decimalFormat(String pattern, Object value) {
return new DecimalFormat(pattern).format(value);
}
/**
* 格式化金额输出每三位用逗号分隔
*

View File

@ -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类的字段 字段不存在则返回<code>null</code>
*

View File

@ -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} 单元测试类
*

View File

@ -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);
}

View File

@ -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 -> {