Field:
java.lang.Object java.lang.reflect.AccessibleObject java.lang.reflect.Field
Field 提供有关类或接口的单个字段的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)字段或实例字段。
获得field的方法
Class.getDeclaredField(String name)
返回一个field 对象,该对象反映此class对象所表示的类或接口的指定已声明字段。
Class.getDeclaredFields()
返回field对象的一个数组,这些对象反映此class对象所表示的类或接口所声明的所有字段。
返回一个field对象,它反映此class对象所表示的类或接口的指定公共成员字段。
Class.getFields()
返回一个包含某些field对象的数组,这些对象反映此class对象所表示的类或接口的所有可访问公共字段。
在看到一个关于String内容修改的代码时看到Field,之前并没有用到过,代码如下:
public class StringModifier { public static void main(String[] str){ try { String test="aaaa"; String test2 =test; String test3 = new String(test); String test4 = new String(test.toCharArray()); Field values = String.class.getDeclaredField("value"); values.setAccessible(true); char[] ref = (char [])values.get(test); ref[0] = 'b'; System.out.println("aaaa"+test+" "+test2+" "+test3+" "+test4); } catch (NoSuchFieldException|SecurityException| IllegalArgumentException|IllegalAccessException ex) { } } }
结果:baaabaaa baaa baaa aaaa
发现其中“aaaa",test,test2,test3被修改了
本文通过一个具体的示例代码展示了如何使用Java反射API中的Field对象来修改String对象的内容。通过设置Field对象的可访问性并直接操作String内部的字符数组,可以改变String的值,尽管这通常被认为是不可变的。
487

被折叠的 条评论
为什么被折叠?



