2015-02-09 36 views
1

還有就是Bukkit API中的方法:getOnlinePlayers()返回一個Collection的方法在被反射調用時返回一個數組?

public static Collection<? extends Player> getOnlinePlayers() 
{ 
    return server.getOnlinePlayers(); 
} 

在舊版本的Bukkit它返回的Player[]陣列;而在較新的版本中則返回Collection<Player>

我想讓它有兩個新版本和舊版本的兼容性可能,所以我使用反射來調用它:

public static Collection<Player> getOnlinePlayers(){ 
    Method m; 
    Object obj = null; 
    try 
    { 
     m = Bukkit.class.getMethod("getOnlinePlayers"); 
     obj = m.invoke(null, (Object[])null); 
    }catch (...){ // omitted 
     throw new RuntimeException(...); // omitted 
    } 

    if (obj instanceof Player[]){ 
     System.out.println("array"); // Used for testing 
     return Arrays.asList((Player[])obj); 
    }else if (obj instanceof Collection){ 
     System.out.println("collection"); // Used for testing 
     return (Collection<Player>)obj; 
    }else{ 
     throw new RuntimeException(...); // omitted 
    } 
} 

那麼這裏的問題:當我在新嘗試這個代碼和舊版本的Bukkit,它總是打印「數組」。我想知道爲什麼會發生這種情況?

+1

很明顯,你只是用返回數組的版本來試試它。 – 2015-02-09 10:39:57

+0

@你能檢查'm.toString()'返回什麼嗎? – 2015-02-09 10:44:11

+1

@defaultlocale好點;-)刪除了。 – laune 2015-02-09 10:45:10

回答

1

我發現了原因。原因是我對Spigot進行了測試,Spigot是一個基於Bukkit的API,但是在Bukkit改變之後仍然保持方法getOnlinePlayers()返回一個數組。當我測試Bukkit時,它會打印出「集合」。

相關問題