最近开始阅读java底层的源码,是因为发现越到后面越发现读源码的重要性,真的很重要,不阅读源码,你会发现“路”越走越窄。
今天看到了String的这个构造方法,
1
2
3
4
5
6
7
8
9 1 /**
2 * Initializes a newly created {@code String} object so that it represents
3 * an empty character sequence. Note that use of this constructor is
4 * unnecessary since Strings are immutable.
5 */
6 public String() {
7 this.value = "".value;
8 }
9
刚开始一直不明白,
1
2
3
4
5
6 1public String() {
2 this.value = "".value;
3 }
4这段代码。
5首先看它的变量,
6
this.value就不需要讲了,重点是不明白后面的这个"".value;
网上很多人说,这其实就是初始化赋值为空字符串,别人不说这个我也能知道,但关键是底层是怎么实现的呢?
刚开始,我也试着写过一样的代码,但是发现.value的时候抱错,网上说
1
2
3
4 1/** The value is used for character storage. */
2 private final char value[];
3
4
这个是私有的,访问不了,依旧不明白到底是上面意思;下面我们来一段代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 1Class clazz = "".getClass();
2System.out.println(""+"的class是:"+clazz);
3Object o = clazz.newInstance();
4Constructor declaredConstructor = clazz.getDeclaredConstructor(String.class);
5Object o2 = declaredConstructor.newInstance("123123");
6Field[] declaredFields = clazz.getDeclaredFields();
7for (Field field: declaredFields){
8 System.out.println("我是由"+""+"声明的对象我有字段:"+field);
9}
10
11Field value = clazz.getDeclaredField("value");
12
13value.setAccessible(true);
14Object o1 = value.get(o2);
15
16System.out.println(o1 instanceof char[]);
17
18char[] o11 = (char[]) o1;
19System.out.println((o11));
20value.setAccessible(true);
21
22
以上代码其实就是java的反射机制,后来才知道,这个位置其实通过反射机制实现的,可以理解为:
"".getClass.newInstance() —->Field.get("value") 来拿到field="value"的值。