JAVA可变参数的一个问题

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/u013041642/article/details/80010043

今天看一同事叫我看 fastjson jar包中的一段代码 在 JSON.class 中,问我这个怎么调用的。内容如下

    public static <T> T parseObject(String text, Class<T> clazz) {
        return parseObject(text, clazz);
    }

我一看我就觉得这肯定死循环呀,递归调用没有结束的判断条件,内存耗完以后栈溢出呗。但是开源的jar包里面怎么可能会有这种错误呢。何况都用了这么久了呢。

debug调试, 发现经过这个方法以后,跳到了重载的另一个带可变参数的方法里:

    public static <T> T parseObject(String json, Class<T> clazz, Feature... features) {
        return parseObject(json, clazz, ParserConfig.global, (ParseProcess)null, DEFAULT_PARSER_FEATURE, features);
    }

但是,有固定参数和可变参数的重载方法,默认优先级:固定参数方法 > 可变参数方法,怎么会跳到可变参数的方法里面去呢。

原来,我在.class 文件里面看到的代码,是编译过后的,跟源码是不一样的。Download Sources 以后才发现,最初以为的递归调用根本不是递归,是这样的:

    public static <T> T parseObject(String text, Class<T> clazz) {
        return parseObject(text, clazz, new Feature[0]);
    }

原来编译后,空的Feature[] 列表被丢掉了。

猜你喜欢

转载自blog.csdn.net/u013041642/article/details/80010043