From fae97d0d3e408fd65303f745b73ce939d30b488b Mon Sep 17 00:00:00 2001 From: duandazhi Date: Wed, 21 Sep 2022 14:03:14 +0800 Subject: [PATCH] =?UTF-8?q?ReflectUtil=E6=96=B0=E5=A2=9EsetFieldModify?= =?UTF-8?q?=E6=96=B9=E6=B3=95=EF=BC=8C=E8=AE=BE=E7=BD=AE=EF=BC=9Afinal?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E5=8F=AF=E4=BB=A5=E8=A2=AB=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/core/util/ReflectUtil.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 5a81bb816..5b6392faf 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -9,6 +9,7 @@ import cn.hutool.core.exceptions.InvocationTargetRuntimeException; import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Filter; +import java.lang.reflect.Modifier; import cn.hutool.core.lang.reflect.MethodHandleUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.WeakConcurrentMap; @@ -345,7 +346,10 @@ public class ReflectUtil { value = ClassUtil.getDefaultValue(fieldType); } + // 设置private私有(私有方法、属性、类)可以被外部方式 setAccessible(field); + // 设置final字段可以被修改 + setFieldModify(field); try { field.set(obj instanceof Class ? null : obj, value); } catch (IllegalAccessException e) { @@ -1108,6 +1112,33 @@ public class ReflectUtil { return accessibleObject; } + + /** + * 设置final的field字段可以被修改 + * @param field 被修改的field,不可以为空 + * @throws UtilException IllegalAccessException等异常包装 + * @since 5.8.8 + * @author dazer + */ + public static void setFieldModify(Field field) { + if (ModifierUtil.hasModifier(field, ModifierUtil.ModifierType.FINAL)) { + //将字段的访问权限设为true:即去除private修饰符的影响 + if (!field.isAccessible()) { + field.setAccessible(true); + } + try { + //去除final修饰符的影响,将字段设为可修改的 + Field modifiersField = Field.class.getDeclaredField("modifiers"); + //Field 的 modifiers 是私有的 + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() &~ Modifier.FINAL); + } catch (NoSuchFieldException | IllegalAccessException e) { + //内部,工具类,基本不抛出异常 + throw new UtilException(e, "IllegalAccess for {}.{}", field.getDeclaringClass(), field.getName()); + } + } + } + /** * 获取方法的唯一键,结构为: *