美文网首页
Java异常:Can not set final [B fiel

Java异常:Can not set final [B fiel

作者: 汉寿周杰伦 | 来源:发表于2020-09-06 16:59 被阅读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~

    相关文章

      网友评论

          本文标题:Java异常:Can not set final [B fiel

          本文链接:https://www.haomeiwen.com/subject/ufbcektx.html