在我的程序中,我有这些类(class):
public class Zombie extends Monster
{
public static String getType() {return "Zombie";}
}
public class Skeleton extends Monster
{
public static String getType() {return "Skeleton";}
}
在我的程序中的某个地方,我想维护程序中存在的所有怪物的列表,目前我这样做:
public class MonsterLister
{
//ArrayList to hold the monsters
private static ArrayList<String> monsters = new ArrayList<>();
public static void main(String[] args)
{
MonsterLister.add(Zombie.getType());
MonsterLister.add(Skeleton.getType());
//More code
}
public static void addMonster(String monster)
{
monsters.add(monster);
}
public static ArrayList<String> getMonsters()
{
return monsters;
}
}
在开发道路上,我将想要添加更多怪物,可能如下所示:
public class Spider extends Monster
{
public static String getType() {return "Spider";}
}
现在我会把它添加到主方法中,但我想要一种让程序自动填充怪物列表的方法。因此,我希望程序只使用所有可用的类,而不是每次添加新怪物并为其添加方法调用时都必须转到主方法。此外,我的主要方法中的方法列表似乎有些草率。
我想过在每个怪物类中都有一个事件监听器,但我仍然需要调用该类来注册事件监听器,所以我仍然需要单独调用每个类。每个类中的静态构造函数也只会在调用类内的方法时触发。
这在 Java 中可能吗?
注意:上面的代码示例不是我的实际程序,但我决定提出一个不同的示例,而不是试图仅用几个代码片段来使实际程序易于理解!
最佳答案
Google 有一个优秀的库,名为 reflections .
您可以执行类似的操作来扫描一组包以查找作为给定类型的子类型的类型:
Reflections reflections = new Reflections("com.my.pkg");
Set<Class<? extends Monster>> monsterTypes = reflections.getSubTypesOf(com.my.pkg.Monster.class);
关于Java 注册可用的类以自动列出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756064/