Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 动态实例化给定抽象父类的所有子类_Java - Fatal编程技术网

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