String源码分析

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

 

转载于:https://www.cnblogs.com/ylht/p/11565619.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值