From f4682c78b2860ce4b3f52e1c1d0925520e464133 Mon Sep 17 00:00:00 2001
From: Zjp <1215582715@qq.com>
Date: Fri, 11 Nov 2022 11:13:28 +0800
Subject: [PATCH] =?UTF-8?q?1.=E4=BC=98=E5=8C=96BeanPath.set()=E6=96=B9?=
=?UTF-8?q?=E6=B3=95,=20=E4=BD=BF=E7=94=A8=E5=BE=AA=E7=8E=AF=E4=BB=A3?=
=?UTF-8?q?=E6=9B=BF=E9=80=92=E5=BD=92,=20=E5=87=8F=E5=B0=91=E5=A1=AB?=
=?UTF-8?q?=E5=85=85=E5=AD=90=E5=AF=B9=E8=B1=A1=E8=BF=87=E7=A8=8B=E4=B8=AD?=
=?UTF-8?q?,=20=E9=87=8D=E5=A4=8D=E8=8E=B7=E5=8F=96=E5=AD=90=E5=AF=B9?=
=?UTF-8?q?=E8=B1=A1=E7=9A=84=E6=8D=9F=E8=80=97;=202.=E7=94=B1=E4=BA=8Eset?=
=?UTF-8?q?=E6=96=B9=E6=B3=95=E4=BF=AE=E6=94=B9,=20=E9=A1=BA=E5=B8=A6?=
=?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86BeanPath.get=E6=96=B9=E6=B3=95,=20?=
=?UTF-8?q?=E5=87=8F=E5=B0=91=E4=BA=86=E6=96=B9=E6=B3=95=E5=8F=82=E6=95=B0?=
=?UTF-8?q?,=20=E4=BC=98=E5=8C=96=E4=BA=86=E5=A4=84=E7=90=86=E9=80=BB?=
=?UTF-8?q?=E8=BE=91,=20=E6=98=8E=E7=A1=AE=E6=96=B9=E6=B3=95=E8=81=8C?=
=?UTF-8?q?=E8=B4=A3;?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/hutool/core/bean/BeanPath.java | 88 +++++++------------
1 file changed, 32 insertions(+), 56 deletions(-)
diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java
index 98c550112..951fbe4dd 100644
--- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java
+++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java
@@ -100,7 +100,7 @@ public class BeanPath implements Serializable {
* @return 值,如果对应值不存在,则返回null
*/
public Object get(final Object bean) {
- return get(this.patternParts, bean, false);
+ return get(this.patternParts, bean);
}
/**
@@ -118,7 +118,35 @@ public class BeanPath implements Serializable {
*/
public void set(final Object bean, final Object value) {
Objects.requireNonNull(bean);
- set(bean, this.patternParts, lastIsNumber(this.patternParts), value);
+
+ Object subBean = bean, previousBean;
+ boolean isFirst = true;
+ String patternPart;
+ // 尝试找到倒数第二个子对象, 最终需要设置它的字段值
+ int length = patternParts.size() - 1;
+ for (int i = 0; i < length; i++) {
+ patternPart = patternParts.get(i);
+ // 保存当前操作的bean, 以便subBean不存在时, 可以用来填充缺失的子对象
+ previousBean = subBean;
+ // 获取当前对象的子对象
+ subBean = getFieldValue(subBean, patternPart);
+ if (null == subBean) {
+ // 支持表达式的第一个对象为Bean本身(若用户定义表达式$开头,则不做此操作)
+ if (isFirst && false == this.isStartWith && BeanUtil.isMatchName(bean, patternPart, true)) {
+ subBean = bean;
+ isFirst = false;
+ } else {
+ // 填充缺失的子对象, 根据下一个表达式决定填充的值, 如果是整数(下标)则使用列表, 否则当做Map对象
+ subBean = NumberUtil.isInteger(patternParts.get(i + 1)) ? new ArrayList<>() : new HashMap<>();
+ BeanUtil.setFieldValue(previousBean, patternPart, subBean);
+ // 上面setFieldValue中有可能发生对象转换, 因此此处重新获取子对象
+ // 欲知详情请自行阅读FieldUtil.setFieldValue(Object, Field, Object)
+ subBean = BeanUtil.getFieldValue(previousBean, patternPart);
+ }
+ }
+ }
+ // 设置最终的字段值
+ BeanUtil.setFieldValue(subBean, patternParts.get(length), value);
}
@Override
@@ -128,69 +156,17 @@ public class BeanPath implements Serializable {
//region Private Methods
- /**
- * 设置表达式指定位置(或filed对应)的值
- * 若表达式指向一个List则设置其坐标对应位置的值,若指向Map则put对应key的值,Bean则设置字段的值
- * 注意:
- *
- *
- * 1. 如果为List,如果下标不大于List长度,则替换原有值,否则追加值 - * 2. 如果为数组,如果下标不大于数组长度,则替换原有值,否则追加值 - *- * - * @param bean Bean、Map或List - * @param patternParts 表达式块列表 - * @param value 值 - */ - private void set(final Object bean, final List