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

@@ -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 值支持BigDecimal、BigInteger、Number等类型
* @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} 单元测试类
*