returns 一个集合在被反射调用时返回一个数组的方法?
A method that returns an Collection is returning an array when it's invoked by reflection?
Bukkit中有方法API:getOnlinePlayers()
:
public static Collection<? extends Player> getOnlinePlayers()
{
return server.getOnlinePlayers();
}
在旧版本的 Bukkit 中,它 returns 一个 Player[]
的数组;而在较新的版本中,它 returns a 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 中尝试这段代码时,它总是打印 "array"。我想知道为什么会这样?
我找到原因了。原因是我正在针对 Spigot 进行测试,它是一个基于 Bukkit 的 API,但即使在 Bukkit 更改后,方法 getOnlinePlayers() 仍会返回一个数组。当我针对 Bukkit 进行测试时,它打印出 "collection".
Bukkit中有方法API:getOnlinePlayers()
:
public static Collection<? extends Player> getOnlinePlayers()
{
return server.getOnlinePlayers();
}
在旧版本的 Bukkit 中,它 returns 一个 Player[]
的数组;而在较新的版本中,它 returns a 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 中尝试这段代码时,它总是打印 "array"。我想知道为什么会这样?
我找到原因了。原因是我正在针对 Spigot 进行测试,它是一个基于 Bukkit 的 API,但即使在 Bukkit 更改后,方法 getOnlinePlayers() 仍会返回一个数组。当我针对 Bukkit 进行测试时,它打印出 "collection".