gpt4 book ai didi

java - 动态实例化给定抽象父类的所有子类

转载 作者:搜寻专家 更新时间:2023-11-01 02:38:05 26 4
gpt4 key购买 nike

有没有办法动态实例化抽象类的所有子类?

我目前的情况是这样的:

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();

}

但是,如果我想实例化所有扩展 Command 的类,而不是在每次添加命令时都单独键入它们并添加到列表中怎么办?

如果我可以动态地实例化它们,我是否也可以动态地操作它们?即在实例化后将每个类添加到列表中。

或者是否有更好的设计可以用更简单的方式完成我想要的?

编辑:@Ash 的解决方案在 IDE 中完美运行,但在使用 jar 时却不行。要使其在两者中都起作用,您所要做的就是改变

classPathList.addAll(ClasspathHelper.forClassLoader());

classPathList.addAll(ClasspathHelper.forJavaClassPath());

希望对大家有帮助!

最佳答案

如果你使用maven(如果没有,你应该:p),添加以下依赖:

<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();
}
}
}

关于java - 动态实例化给定抽象父类的所有子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41678256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com