mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
fix bug#I3AXIJ
This commit is contained in:
parent
5cdbd16c0b
commit
511f688d1e
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# 5.6.0 (2021-03-10)
|
# 5.6.0 (2021-03-11)
|
||||||
|
|
||||||
### 新特性
|
### 新特性
|
||||||
* 【poi 】 重要:不再兼容POI-3.x,增加兼容POI-5.x(issue#I35J6B@Gitee)
|
* 【poi 】 重要:不再兼容POI-3.x,增加兼容POI-5.x(issue#I35J6B@Gitee)
|
||||||
@ -15,10 +15,12 @@
|
|||||||
* 【core 】 NumberUtil增加factorial针对BigInterger方法(issue#1379@Github)
|
* 【core 】 NumberUtil增加factorial针对BigInterger方法(issue#1379@Github)
|
||||||
* 【core 】 TreeNode增加equals方法(issue#1467@Github)
|
* 【core 】 TreeNode增加equals方法(issue#1467@Github)
|
||||||
* 【core 】 增加汉字转阿拉伯数字Convert.chineseToNumber(pr#1469@Github)
|
* 【core 】 增加汉字转阿拉伯数字Convert.chineseToNumber(pr#1469@Github)
|
||||||
|
* 【json 】 JSONUtil增加getByPath方法支持默认值(issue#1470@Github)
|
||||||
|
|
||||||
### Bug修复
|
### Bug修复
|
||||||
* 【socket 】 修复Client创建失败资源未释放问题。
|
* 【socket 】 修复Client创建失败资源未释放问题。
|
||||||
* 【core 】 修复DataSizeUtil中EB单位错误问题(issue#I39O7I@Gitee)
|
* 【core 】 修复DataSizeUtil中EB单位错误问题(issue#I39O7I@Gitee)
|
||||||
|
* 【core 】 修复BeanDesc.isMatchSetter的ignoreCase未使用问题(issue#I3AXIJ@Gitee)
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -249,12 +249,14 @@ public class BeanDesc implements Serializable {
|
|||||||
* @return 是否匹配
|
* @return 是否匹配
|
||||||
*/
|
*/
|
||||||
private boolean isMatchGetter(String methodName, String fieldName, boolean isBooleanField, boolean ignoreCase) {
|
private boolean isMatchGetter(String methodName, String fieldName, boolean isBooleanField, boolean ignoreCase) {
|
||||||
// 全部转为小写,忽略大小写比较
|
final String handledFieldName;
|
||||||
if (ignoreCase) {
|
if (ignoreCase) {
|
||||||
|
// 全部转为小写,忽略大小写比较
|
||||||
methodName = methodName.toLowerCase();
|
methodName = methodName.toLowerCase();
|
||||||
fieldName = fieldName.toLowerCase();
|
handledFieldName = fieldName.toLowerCase();
|
||||||
|
fieldName = handledFieldName;
|
||||||
} else {
|
} else {
|
||||||
fieldName = StrUtil.upperFirst(fieldName);
|
handledFieldName = StrUtil.upperFirst(fieldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (false == methodName.startsWith("get") && false == methodName.startsWith("is")) {
|
if (false == methodName.startsWith("get") && false == methodName.startsWith("is")) {
|
||||||
@ -271,12 +273,12 @@ public class BeanDesc implements Serializable {
|
|||||||
if (fieldName.startsWith("is")) {
|
if (fieldName.startsWith("is")) {
|
||||||
// 字段已经是is开头
|
// 字段已经是is开头
|
||||||
if (methodName.equals(fieldName) // isName -》 isName
|
if (methodName.equals(fieldName) // isName -》 isName
|
||||||
|| methodName.equals("get" + fieldName)// isName -》 getIsName
|
|| methodName.equals("get" + handledFieldName)// isName -》 getIsName
|
||||||
|| methodName.equals("is" + fieldName)// isName -》 isIsName
|
|| methodName.equals("is" + handledFieldName)// isName -》 isIsName
|
||||||
) {
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} else if (methodName.equals("is" + fieldName)) {
|
} else if (methodName.equals("is" + handledFieldName)) {
|
||||||
// 字段非is开头, name -》 isName
|
// 字段非is开头, name -》 isName
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -304,9 +306,15 @@ public class BeanDesc implements Serializable {
|
|||||||
* @return 是否匹配
|
* @return 是否匹配
|
||||||
*/
|
*/
|
||||||
private boolean isMatchSetter(String methodName, String fieldName, boolean isBooleanField, boolean ignoreCase) {
|
private boolean isMatchSetter(String methodName, String fieldName, boolean isBooleanField, boolean ignoreCase) {
|
||||||
// 全部转为小写,忽略大小写比较
|
final String handledFieldName;
|
||||||
methodName = methodName.toLowerCase();
|
if (ignoreCase) {
|
||||||
fieldName = fieldName.toLowerCase();
|
// 全部转为小写,忽略大小写比较
|
||||||
|
methodName = methodName.toLowerCase();
|
||||||
|
handledFieldName = fieldName.toLowerCase();
|
||||||
|
fieldName = handledFieldName;
|
||||||
|
} else {
|
||||||
|
handledFieldName = StrUtil.upperFirst(fieldName);
|
||||||
|
}
|
||||||
|
|
||||||
// 非标准Setter方法跳过
|
// 非标准Setter方法跳过
|
||||||
if (false == methodName.startsWith("set")) {
|
if (false == methodName.startsWith("set")) {
|
||||||
@ -314,7 +322,7 @@ public class BeanDesc implements Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 针对Boolean类型特殊检查
|
// 针对Boolean类型特殊检查
|
||||||
if (isBooleanField && fieldName.startsWith("is")) {
|
if (isBooleanField && handledFieldName.startsWith("is")) {
|
||||||
// 字段是is开头
|
// 字段是is开头
|
||||||
if (methodName.equals("set" + StrUtil.removePrefix(fieldName, "is"))// isName -》 setName
|
if (methodName.equals("set" + StrUtil.removePrefix(fieldName, "is"))// isName -》 setName
|
||||||
|| methodName.equals("set" + fieldName)// isName -》 setIsName
|
|| methodName.equals("set" + fieldName)// isName -》 setIsName
|
||||||
@ -327,4 +335,4 @@ public class BeanDesc implements Serializable {
|
|||||||
return methodName.equals("set" + fieldName);
|
return methodName.equals("set" + fieldName);
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------------------------------------ Private method end
|
// ------------------------------------------------------------------------------------------------------ Private method end
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,7 @@ import org.junit.Test;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link BeanDesc} 单元测试类
|
* {@link BeanDesc} 单元测试类
|
||||||
*
|
*
|
||||||
* @author looly
|
* @author looly
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -20,48 +20,48 @@ public class BeanDescTest {
|
|||||||
Assert.assertEquals("getAge", desc.getGetter("age").getName());
|
Assert.assertEquals("getAge", desc.getGetter("age").getName());
|
||||||
Assert.assertEquals("setAge", desc.getSetter("age").getName());
|
Assert.assertEquals("setAge", desc.getSetter("age").getName());
|
||||||
Assert.assertEquals(1, desc.getSetter("age").getParameterTypes().length);
|
Assert.assertEquals(1, desc.getSetter("age").getParameterTypes().length);
|
||||||
Assert.assertEquals(int.class, desc.getSetter("age").getParameterTypes()[0]);
|
Assert.assertSame(int.class, desc.getSetter("age").getParameterTypes()[0]);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void propDescTes2() {
|
public void propDescTes2() {
|
||||||
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
||||||
|
|
||||||
PropDesc prop = desc.getProp("name");
|
PropDesc prop = desc.getProp("name");
|
||||||
Assert.assertEquals("name", prop.getFieldName());
|
Assert.assertEquals("name", prop.getFieldName());
|
||||||
Assert.assertEquals("getName", prop.getGetter().getName());
|
Assert.assertEquals("getName", prop.getGetter().getName());
|
||||||
Assert.assertEquals("setName", prop.getSetter().getName());
|
Assert.assertEquals("setName", prop.getSetter().getName());
|
||||||
Assert.assertEquals(1, prop.getSetter().getParameterTypes().length);
|
Assert.assertEquals(1, prop.getSetter().getParameterTypes().length);
|
||||||
Assert.assertEquals(String.class, prop.getSetter().getParameterTypes()[0]);
|
Assert.assertSame(String.class, prop.getSetter().getParameterTypes()[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void propDescOfBooleanTest() {
|
public void propDescOfBooleanTest() {
|
||||||
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
||||||
|
|
||||||
Assert.assertEquals("isAdmin", desc.getGetter("isAdmin").getName());
|
Assert.assertEquals("isAdmin", desc.getGetter("isAdmin").getName());
|
||||||
Assert.assertEquals("setAdmin", desc.getSetter("isAdmin").getName());
|
Assert.assertEquals("setAdmin", desc.getSetter("isAdmin").getName());
|
||||||
Assert.assertEquals("isGender", desc.getGetter("gender").getName());
|
Assert.assertEquals("isGender", desc.getGetter("gender").getName());
|
||||||
Assert.assertEquals("setGender", desc.getSetter("gender").getName());
|
Assert.assertEquals("setGender", desc.getSetter("gender").getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void propDescOfBooleanTest2() {
|
public void propDescOfBooleanTest2() {
|
||||||
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
||||||
|
|
||||||
Assert.assertEquals("isIsSuper", desc.getGetter("isSuper").getName());
|
Assert.assertEquals("isIsSuper", desc.getGetter("isSuper").getName());
|
||||||
Assert.assertEquals("setIsSuper", desc.getSetter("isSuper").getName());
|
Assert.assertEquals("setIsSuper", desc.getSetter("isSuper").getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getSetTest() {
|
public void getSetTest() {
|
||||||
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
BeanDesc desc = BeanUtil.getBeanDesc(User.class);
|
||||||
|
|
||||||
User user = new User();
|
User user = new User();
|
||||||
desc.getProp("name").setValue(user, "张三");
|
desc.getProp("name").setValue(user, "张三");
|
||||||
Assert.assertEquals("张三", user.getName());
|
Assert.assertEquals("张三", user.getName());
|
||||||
|
|
||||||
Object value = desc.getProp("name").getValue(user);
|
Object value = desc.getProp("name").getValue(user);
|
||||||
Assert.assertEquals("张三", value);
|
Assert.assertEquals("张三", value);
|
||||||
}
|
}
|
||||||
@ -101,7 +101,7 @@ public class BeanDescTest {
|
|||||||
public void setAdmin(boolean isAdmin) {
|
public void setAdmin(boolean isAdmin) {
|
||||||
this.isAdmin = isAdmin;
|
this.isAdmin = isAdmin;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isIsSuper() {
|
public boolean isIsSuper() {
|
||||||
return isSuper;
|
return isSuper;
|
||||||
}
|
}
|
||||||
|
@ -546,6 +546,35 @@ public class JSONUtil {
|
|||||||
return (null == json || StrUtil.isBlank(expression)) ? null : json.getByPath(expression);
|
return (null == json || StrUtil.isBlank(expression)) ? null : json.getByPath(expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过表达式获取JSON中嵌套的对象<br>
|
||||||
|
* <ol>
|
||||||
|
* <li>.表达式,可以获取Bean对象中的属性(字段)值或者Map中key对应的值</li>
|
||||||
|
* <li>[]表达式,可以获取集合等对象中对应index的值</li>
|
||||||
|
* </ol>
|
||||||
|
* <p>
|
||||||
|
* 表达式栗子:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* persion
|
||||||
|
* persion.name
|
||||||
|
* persons[3]
|
||||||
|
* person.friends[5].name
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* @param <T> 值类型
|
||||||
|
* @param json {@link JSON}
|
||||||
|
* @param expression 表达式
|
||||||
|
* @param defaultValue 默认值
|
||||||
|
* @return 对象
|
||||||
|
* @see JSON#getByPath(String)
|
||||||
|
* @since 5.6.0
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T> T getByPath(JSON json, String expression, T defaultValue) {
|
||||||
|
return (T) ObjectUtil.defaultIfNull(getByPath(json, expression), defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 设置表达式指定位置(或filed对应)的值<br>
|
* 设置表达式指定位置(或filed对应)的值<br>
|
||||||
* 若表达式指向一个JSONArray则设置其坐标对应位置的值,若指向JSONObject则put对应key的值<br>
|
* 若表达式指向一个JSONArray则设置其坐标对应位置的值,若指向JSONObject则put对应key的值<br>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user