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