String源码分析

释放双眼,带上耳机,听听看~!

最近开始阅读java底层的源码,是因为发现越到后面越发现读源码的重要性,真的很重要,不阅读源码,你会发现“路”越走越窄。

今天看到了String的这个构造方法,

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

String源码分析

 

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"的值。

 

给TA打赏
共{{data.count}}人
人已打赏
安全经验

Google Adsense的技巧、诀窍和秘密

2021-10-11 16:36:11

安全经验

安全咨询服务

2022-1-12 14:11:49

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索