最近开始阅读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"的值。