Java异常:Can not set final [B fiel
2020-09-06 本文已影响0人
汉寿周杰伦
事情是这样的,在通过反射修改String
的final
字段的时候,出现该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~