1. 程式人生 > >JAVA可變引數的一個問題

JAVA可變引數的一個問題

今天看一同事叫我看 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[] 列表被丟掉了。

相關推薦

JAVA可變引數一個問題

今天看一同事叫我看 fastjson jar包中的一段程式碼 在 JSON.class 中,問我這個怎麼呼叫的。內容如下 public static <T> T parseObject(String text, Class<T>

java 可變引數,集合與陣列的互轉,靜態匯入

可變引數 可變引數是如果型別確定,引數個數不確定,需要用可變引數來定義,引數的具體個數在方法呼叫時才能確定java把可變引數當做陣列處理 可變引數的定義是jdk1.5加入的,比如main方法 public static void main(String [] args) 特點:

Java可變引數的使用

Java相關知識 基本資料型別(八個):byte , short , int , long , float,double,boolean,char, 基本資料型別 .length() 不是基本資料型別 .length 可變引數的使用 public

Java可變引數型別與陣列的區別聯絡

Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用,本文對此加以分析。如下:  public class TestVarArgus { public static void dealArray(int... intArray) { }

Java可變引數應用實操

有時候會對某個函式的入參無法確定輸入個數,這個時候就需要使用可變引數,先來看看是如何使用的。 public class Test { /** * @param args */ public static void main(String[

深度解析Java可變引數型別以及與陣列的區別

這篇文章主要介紹了Java方法的可變引數型別,通過例項對Java中的可變引數型別進行了較為深入的分析,需要的朋友可以參考下。 Java方法中的可變引數型別是一個非常重要的概念,有著非常廣泛的應用。本文就以例項形式對此加以分析。具體如下: 一般來說,許多Java初學者在

Java可變引數個數方法

/* *JDK5.0新特性:可變個數形式引數 * * 1.可匹配0至多個引數 * 2.可與其他同名方法構成過載 * 3.與陣列的使用方法一直,只是多了“沒有引數” * 4.若要加入其它型別

java可變引數總結

今天總結一下java中可變引數這個知識點。還是來看一個例子,現在我想寫個方法來計算兩個整形的和並且輸出,這個方法很簡單: public class KeBian { public static void main(String[] args) {

Java:可變引數列表

知識總結: package imooc.method; public class ArgsDemo { //求和 public void sum(int...n){ int sum=0

Java可變引數方法過載時要注意的幾個問題

轉載自:http://www.blogjava.net/rongxh7/archive/2010/04/18/318698.html JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的

java 可變引數獲取引數

public static String isParamsEmpty(String ... params) { StringBuffer buf = new StringBuffer("") ; for (String str : params) { i

java學習筆記---Java可變引數方法過載時要注意的幾個問題

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。 然而,使用可變

Java可變引數(...)方法過載時要注意的幾個問題

JDK1.5引進了方法的可變引數,受到許多開發人員的青睞。有了這種機制,我們可以寫出類似於JavaScript的arguments那樣的帶任意多個引數的方法。Java的可變引數,可用於普通方法上,也可以用於構造方法上,大大增大了我們所寫方法的適用範圍。 然而

Java可變引數

什麼是可變引數 在 Java 5 中提供了變長引數,允許在呼叫方法時傳入不定長度的引數。變長引數是Java的一個語法糖,本質上還是基於陣列的實現 void foo(String... args); void foo(String[] args);

java 可變引數的問題 String... params

java中經常會使用的可變引數 private String getHdfsPath(String originalHdfsPath, String... params) 使用可變引數是判斷引數個數

java可變引數運用

可變引數 Java 語言在 JDK1.5 中首次推出可變引數, variable arguments ,或簡稱 varargs 。這一新語言特徵給軟體開發人員在編寫方法過載時提供了方便和靈活性。但可變引數的應用並不像想象的那麼簡單,使用時有其特殊要求和侷限性。 12.7.1

坑爹的 Java 可變引數,把我整得夠慘。。

最近在寫一個功能點,用了 Java 中的可變引數,真是把我搞得夠慘。。 什麼是可變引數? 就是方法引數用 Object... ar

Java集合總結,泛型機制,可變引數

List實現類的區別及適用場景   底層實現 優缺點 執行緒是否安全 效率 適用場景 ArrayList 陣列 查詢易,增刪難 否 高

Java中不定項引數可變引數)的作用和使用方式

引言:   我們在編寫方法的過程中,可能會遇見一個方法有不確定引數個數的情況。一般我們會用方法過載來解決問題: //方法過載,解決引數個數不確定問題 public void method(); public void method(int i); public void method(int

Java方法的可選引數 可變引數

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!