Field的public void setAccessible(boolean flag) 说明

   * Set the {@code accessible} flag for this object to
* the indicated boolean value.  A value of {@code true} indicates that
* the reflected object should suppress Java language access
* checking when it is used.  A value of {@code false} indicates
* that the reflected object should enforce Java language access checks.

如果flag设置为true,那么就会压制java语言的访问校验。

Java String 类定义

1
2
3
4
5
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}

测试代码:

1
2
3
4
5
6
7
private static void directChangeStringFinalRef() throws Exception {
String a = "";
Field filed = a.getClass().getDeclaredField("value");
filed.setAccessible(true); //false
filed.set(a,new char[]{'1','2'});
System.out.println(a);
}

设置为false时,机会出现如下异常:

1
2
3
4
5
6
Exception in thread "main" java.lang.IllegalAccessException: Class book.base.collections.HelloCollections can not access a member of class java.lang.String with modifiers "private final"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Field.set(Field.java:761)
at book.base.collections.HelloCollections.directChangeStringFinalRef(HelloCollections.java:93)