String str = "java";
//打印原字符串
System.out.println("开始的字符串...."+str);
//获取String类中的value字段
Field fieldStr = String.class.getDeclaredField("value");
//因为value是private声明的,这里修改其访问权限
fieldStr.setAccessible(true);
//获取str对象上的value属性的值
char[] value = (char[]) fieldStr.get(str);
//将第一个字符修改为 V(小写改大写)
value[0] = 'J';
value[1] = 'A';
value[3] = 'A';
//打印修改之后的字符串
System.out.println("更改后的字符串...."+str);
打印结果---------------
开始的字符串…java
更改后的字符串…JAvA
但是在代码里,几乎不会使用反射的机制去操作 String 字符串,所以,我们会认为 String 类型是不可变的。
使用反射技术绕过泛型编译期间检查,将不同的数据类型 存储到带有泛型的集合
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(123);
list.add(456);
list.add(789);
// 获取list字节文字对象
Class clazz = list.getClass();
System.out.println(clazz);
// 存储对象 调用的是集合中的 add()方法 那么通过反射获取add方法
Method m = clazz.getMethod("add", Object.class);
//对象有了 方法有了 运行add方法
m.invoke(list, "abc");
m.invoke(list, "sss");
m.invoke(list, "qqq");
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}