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中尝试此代码时,它总是打印“数组”。我想知道为什么会这样呢?
答案 0 :(得分:1)
我发现了原因。原因是我正在测试Spigot,这是一个基于Bukkit的API,但是即使在Bukkit改变之后,仍然保持方法getOnlinePlayers()返回一个数组。当我对Bukkit进行测试时,会打印出“collection”。