Java异常:Can not set final [B fiel

2020-09-06  本文已影响0人  汉寿周杰伦

事情是这样的,在通过反射修改Stringfinal字段的时候,出现该IllegalArgumentException异常:

Field field1 = str1.getClass().getDeclaredField("value");
field1.setAccessible(true);
field1.set(str1, newStr2.toCharArray()); 

运行结果是:

Exception in thread "main" java.lang.IllegalArgumentException: Can not set final [B field java.lang.String.value to [C
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:167)
    at java.base/jdk.internal.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:171)
    at java.base/jdk.internal.reflect.UnsafeQualifiedObjectFieldAccessorImpl.set(UnsafeQualifiedObjectFieldAccessorImpl.java:83)
    at java.base/java.lang.reflect.Field.set(Field.java:778)
    at com.zm.swap.twoString.Solution.swap1(Solution.java:33)
    at com.zm.swap.twoString.Solution.main(Solution.java:17)

主要的报错提示就是这个:Can not set final [B field java.lang.String.value to [C,我觉得可能是String的底层的value值被final关键字修饰了,所以不能改。因为对Filed类不是很熟悉,所以去网上找了一下相关的文章,最后仔细看了一下这个Filed类的set()方法才明白是哪儿出错了:


因为JVM在编译时期, 就把final类型的String进行了优化,在编译时期就会把String处理成常量,所以无法修改类似String str = "111111"的值。

所以优化之后的代码如下所示:

// 新建个类:User
User{
  String name = "zm"
}

User user1 = new User();
Field field = user1.getClass().getDeclaredField("name");
field.setAccessible(true);
field.set(user1, "yw");

这里的name属性就是文档中要求的声明底层字段,so can be changed~

上一篇下一篇

猜你喜欢

热点阅读