返回一个Collection的方法是在反射调用时返回一个数组?

时间:2015-02-09 10:34:52

标签: java arrays reflection collections

Bukkit API中有一种方法:getOnlinePlayers()

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 个答案:

答案 0 :(得分:1)

我发现了原因。原因是我正在测试Spigot,这是一个基于Bukkit的API,但是即使在Bukkit改变之后,仍然保持方法getOnlinePlayers()返回一个数组。当我对Bukkit进行测试时,会打印出“collection”。