A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 adalvik 于 2015-5-9 10:52 编辑

我们知道java中是没有指针这个概念,所以我们是没办法传一个二级指针的,
那我们该怎么办呢
先看一个函数
  1. public static void main(String[] args) {
  2.   String str = "Hello kugou";
  3.         change(str);
  4.         System.out.println(str);
  5. }
  6. public static void change(String s)
  7. {
  8.         s="透心凉,心飞扬";
  9.         }
复制代码
原本我们想通过  change 去改变mStr 的值 却发现修改不了原来它只是传的一个值过去,也就是一份拷贝,需要了解java的传值 和传址那么上面的代码 就可以写成
  1. public static void main(String[] args) {
  2.       String str= "Hello kugou";
  3.       String str2=str;
  4.                 Str2="透心凉,心飞扬";
  5.                 System.out.println(str);
  6.                
  7.         }
复制代码
这样修改有效么 。答案当然是无效的于是乎画了两张图来理解

我们如何通过 str2去修改str的值,我们必须得到str这个数据存放的真实的地址,那么反射就来了    通过查看String的源码private final char value[];这个char value[]存放的就是Sting字符串        我们只要根据str2顺藤摸瓜 找到str 在找到strvalue修改就好了
说白了就是修改char value[]我们将原代码改下
  1. public static void main(String[] args) throws Exception {

  2.                 String str = "Hello";
  3.       String str2 = str;
  4.                 Field field = String.class.getDeclaredField("value");
  5.                 field.setAccessible(true);
  6.                 field.set(str2, "透心凉,心飞扬".toCharArray());//此时的str2是指向str的
  7.            System.out.println(str);

  8.         }
复制代码
于是乎我们将代码封装下
  1. public static void main(String[] args) throws Exception {

  2.                 String str = "Hello";

  3.                 change(str);
  4.                 System.out.println(str);
  5.         }


  6.         public static void change(String str) {
  7.                 try {

  8.                         Field field = str.getClass().getDeclaredField("value");
  9.                         // 看String 源码 private final char value[]; String的数据
  10.                         // private int hash; // Default to 0

  11.                         field.setAccessible(true);// 取消安全检查

  12.         

  13.                         field.set(str, "heima".toCharArray());// 所以这里 传过去的参数 也应该是char []
  14.                                                                                                         // 修改str

  15.                 } catch (Exception e) {
  16.                         // TODO Auto-generated catch block
  17.                         e.printStackTrace();
  18.                 }
  19.         }
复制代码
运行之后 输出str =heima
                                                                  昨天面试 发现很多东西都知道,但是却无法正确的表达出来(所以得多练习表达能力--)...主要是黑马的面试官太漂亮了....~~谁看到美女还特么的想聊技术啊,其实我也想回过头问老师..家庭情况如何,是否有男朋友~~,顺便说下,大家面试的时候千万别太紧张,不然脑子一片空白.连个递归都会找不到出口.

1 个回复

倒序浏览
顶一个!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马