gpt4 book ai didi

java - 无法为 private static Final Map 设置新值

转载 作者:行者123 更新时间:2023-12-02 00:16:11 29 4
gpt4 key购买 nike

我正在使用方法

   static void setFinalStatic(Field field, Object newValue) throws Exception
{
field.setAccessible(true);

final Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

field.set(null, newValue);
}

用于更改私有(private)静态最终字段。
但如果字段的类型为 Map 我会得到异常

Exception in thread "main" java.lang.IllegalAccessException: Can not set static final java.util.Map field org.hibernate.type.TypeFactory.BASIC_TYPES to java.util.HashMap
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:55)
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:59)
at sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl.set(UnsafeQualifiedStaticObjectFieldAccessorImpl.java:59)
at java.lang.reflect.Field.set(Field.java:657)
at com.company.tester.Main.setFinalStatic(Main.java:64)

有什么想法吗?

更多代码

  Field types = TypeFactory.class.getDeclaredField("BASIC_TYPES");
types.setAccessible(true);
Map val = (Map) types.get(null);
Map newMap = new HashMap(val);
newMap.put(String.class.getName(), new MyType());
setFinalStatic(TypeFactory.class.getDeclaredField("BASIC_TYPES"), new HashMap());

最佳答案

field.setAccessible(true) 关闭该字段的所有安全检查。改变其明显的修饰符不会有帮助。还有其他东西阻止了这个工作。

我不会尝试替换 map ,而是尝试更新它。

Field types = TypeFactory.class.getDeclaredField("BASIC_TYPES");
types.setAccessible(true);
Object bt = types.get(null);
Field m = bt.getClass().getDeclaredField("m");
m.setAccessible(true);
Map val = (Map) m.get(bt);
val.put(String.class.getName(), new MyType());

关于java - 无法为 private static Final Map 设置新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11864650/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com