java code as follow.
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class Test {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
C c = new C();
Field field = c.getClass().getDeclaredField("NAME");
field.setAccessible(true);
System.out.println(field.get(c));//Cause program exception on line 15 while using method get(java.lang.reflect.Field#get).
Field modifiers = field.getClass().getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
System.out.println(Modifier.toString(field.getModifiers()));
field.set(c,"James");
System.out.println(field.get(c));
}
}
class C{
private static final String NAME = "Clive";
public String toString(){
return NAME;
}
}
An exception occured when I use java.lang.reflect.Field#set。Exception information as follow. However,if I delete the code(System.out.println(field.get(c));) on line 9,no exception occured
Exception in thread "main" java.lang.IllegalAccessException: Can not set static final java.lang.String field C.NAME to java.lang.String
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:73)
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:77)
at sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl.set(UnsafeQualifiedStaticObjectFieldAccessorImpl.java:77)
at java.lang.reflect.Field.set(Field.java:741)
at Test.main(Test.java:15)