在我的程序中,我有这些类:
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";}
}
现在我会把它添加到主方法中,但我想要一种让程序自动填充怪物列表的方法。因此,我不必每次添加新怪物并为其添加方法调用时都转到 main 方法,我希望程序只使用所有可用的类。此外,我的主方法中的方法列表似乎有些草率。
我想过在每个怪物类中都有一个事件侦听器,但我仍然需要调用该类来注册事件侦听器,所以我仍然必须单独调用每个类。每个类中的静态构造函数也仅在调用类内的方法时触发。
这在Java中可能吗?
注意:上面的代码示例不是我的实际程序,但我决定提出一个不同的示例,而不是尝试仅用几段代码使实际程序易于理解!
谷歌有一个很好的库,叫做反射。
您可以执行以下操作来扫描一组包以查找作为给定类型的子类型的类型:
Reflections reflections = new Reflections("com.my.pkg");
Set<Class<? extends Monster>> monsterTypes = reflections.getSubTypesOf(com.my.pkg.Monster.class);