本帖最后由 adalvik 于 2015-5-9 10:52 编辑
我们知道java中是没有指针这个概念,所以我们是没办法传一个二级指针的, 那我们该怎么办呢 先看一个函数 - public static void main(String[] args) {
- String str = "Hello kugou";
- change(str);
- System.out.println(str);
- }
- public static void change(String s)
- {
- s="透心凉,心飞扬";
- }
复制代码原本我们想通过 change 去改变mStr 的值 却发现修改不了原来它只是传的一个值过去,也就是一份拷贝,需要了解java的传值 和传址那么上面的代码 就可以写成 - public static void main(String[] args) {
- String str= "Hello kugou";
- String str2=str;
- Str2="透心凉,心飞扬";
- System.out.println(str);
-
- }
复制代码这样修改有效么 。答案当然是无效的于是乎画了两张图来理解
我们如何通过 str2去修改str的值,我们必须得到str这个数据存放的真实的地址,那么反射就来了 通过查看String的源码private final char value[];这个char value[]存放的就是Sting字符串 我们只要根据str2顺藤摸瓜 找到str 在找到str的value修改就好了说白了就是修改 char value[]我们将原代码改下 - public static void main(String[] args) throws Exception {
- String str = "Hello";
- String str2 = str;
- Field field = String.class.getDeclaredField("value");
- field.setAccessible(true);
- field.set(str2, "透心凉,心飞扬".toCharArray());//此时的str2是指向str的
- System.out.println(str);
- }
复制代码于是乎我们将代码封装下 - public static void main(String[] args) throws Exception {
- String str = "Hello";
- change(str);
- System.out.println(str);
- }
- public static void change(String str) {
- try {
- Field field = str.getClass().getDeclaredField("value");
- // 看String 源码 private final char value[]; String的数据
- // private int hash; // Default to 0
- field.setAccessible(true);// 取消安全检查
-
- field.set(str, "heima".toCharArray());// 所以这里 传过去的参数 也应该是char []
- // 修改str
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
复制代码运行之后 输出str =heima
昨天面试 发现很多东西都知道,但是却无法正确的表达出来(所以得多练习表达能力--)...主要是黑马的面试官太漂亮了....~~谁看到美女还特么的想聊技术啊,其实我也想回过头问老师..家庭情况如何,是否有男朋友~~,顺便说下,大家面试的时候千万别太紧张,不然脑子一片空白.连个递归都会找不到出口.
|