Java 动态实例化给定抽象父类的所有子类
有没有一种方法可以动态实例化抽象类的所有子类 我目前的情况与此类似:Java 动态实例化给定抽象父类的所有子类,java,Java,有没有一种方法可以动态实例化抽象类的所有子类 我目前的情况与此类似: public class CommandHandler { private Command info = new Info(); private Command prefix = new Prefix(); private Command roll = new Roll(); private Command coin = new Coin()
public class CommandHandler {
private Command info = new Info();
private Command prefix = new Prefix();
private Command roll = new Roll();
private Command coin = new Coin();
private Command invite = new Invite();
private Command quit = new Quit();
private Command restart = new Restart();
}
抽象父类如下所示:
public abstract class Command {
protected String name;
protected String arguments;
protected abstract void execute();
}
但是,如果我想实例化扩展命令的所有类,而不单独键入它们,并在每次添加命令时添加到列表中,该怎么办
如果我能动态地实例化它们,我还能动态地操作它们吗?i、 e.实例化后,将每个类添加到列表中
还是有更好的设计可以用更简单的方式实现我想要的
EDIT:@Ash的解决方案在IDE中非常有效,但在使用jar时就不行了。你所要做的就是改变,让它在这两方面都发挥作用
classPathList.addAll(ClasspathHelper.forClassLoader());
到
希望它能帮助别人 如果使用maven(如果不是,则应:p),则添加以下依赖项:
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
组织反思
反思
0.9.10
然后,您可以使用以下代码列出所需的类(假设您有一个没有参数的构造函数):
公共类加载器{
公共静态void main(字符串[]args){
试一试{
Set classPathList=newhashset();
addAll(ClasspathHelper.forClassLoader());
如果我自己创建一个命令
子类怎么办?你的命令处理程序
如何知道这个类?(答案是:不,在编写代码时你不能知道所有可能的子类。)如果在编译时确实知道各种子类,您是否考虑过使用enum
?这可能有助于@aioobe Java对此类问题进行反思-在运行时可以找出其他可用的类。为什么需要这样做?@mcempire我想加载给定类的子类,而不必键入我自己编写代码,因为我希望能够更轻松、更优雅地添加新的子类。命令就是一个例子,但我认为还有很多其他应用程序可以实现类似的功能。这非常好!谢谢。我不知道有这样的东西存在。另外,对于那些不想使用Maven的人,您需要以下JAR才能让它工作:reflsections-0.9.10.jar、javassist-3.19.0-GA.jar、guava-15.0.jar和annotations-2.0.1.jar。
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.10</version>
</dependency>
public class Loader {
public static void main(String[] args) {
try {
Set<URL> classPathList = new HashSet<URL>();
classPathList.addAll(ClasspathHelper.forClassLoader());
Set<Class<? extends Command>> result = new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner()).setUrls(classPathList)).getSubTypesOf(Command.class);
List<Command> commands = new ArrayList<Command>();
for (Class<? extends Command> c : result) {
System.out.println(c.getSimpleName());
commands.add(c.newInstance());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}