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

  • 相关阅读:
    个人项目(Word Count Java)
    自我介绍+软工5问
    第六次实践
    第五次实践作业
    第四次实践作业
    第三次实践作业
    第二次实践作业
    第1次实践作业
    第06组 Beta版本演示
    第06组 Beta冲刺(4/4)
  • 原文地址:https://www.cnblogs.com/ylht/p/11565619.html
Copyright © 2020-2023  润新知