繁体   English   中英

创建所有类的对象,以扩展Java中的抽象类

[英]Create objects of all classes extending an abstract class in java

我在实现Runnable的Java中有一个名为“ ExerciseMovement”的抽象类,并有具体的类扩展了实现run()方法的抽象类。 在我的客户代码中,我试图创建一个代码,该代码创建扩展抽象类并启动其线程的所有类的对象。 我不确定是否可以在不知道哪些类扩展抽象类的情况下做到这一点。 可能吗?

在Java中不可能直接知道所有子类。

有两个临时解决此问题的方法。

  1. 扫描整个类路径:
    为此,您可以使用Reflections库

     Reflections reflections = new Reflections("my.package.prefix"); Set<Class<? extends ExerciseMovement>> subclasses = reflections .getSubTypesOf(my.package.prefix.ExerciseMovement.class); 

    您将在2行中得到想要的东西。
    现在创建对象和启动线程很容易。

  2. 让每个类将自己注册(在静态块中)到基类( ExerciseMovement )并维护所有子类的列表。

    尽管这很容易做到,但它不适用于所有子类。 只有已经加载由类加载器 的子类将提供给你。

希望这可以帮助。

我不认为Java具有这种机制。 您可以做的是在ExerciseMovementRegister上“注册”每个实现的类,这可以为您提供这些类的列表。 这将需要在静态块中完成(这不理想)。 为它们创建对象很简单(伪代码,未编译!):

List<Class<? extends ExerciseMovement>> exerciseClasses = ExerciseMovementRegister.getClasses();

for(Class klass: exerciseClasses) {
  ExerciseMovement move = (ExerciseMovement) klass.newInstance();
  move.start();
}

您无法获得所有通过标准反射扩展超类的类。 但是您可以通过面向对象的方式解决此问题:

public abstract class ExerciseMovement 
{
@SuppressWarnings("rawtypes")
private static ArrayList<Class> inheritedClasses = new ArrayList<Class>();

public ExerciseMovement()
{
    inheritedClasses.add(this.getClass());
}

@SuppressWarnings("rawtypes")
public Object[] createInheritedObjects()
{
    ArrayList<Object> result = new ArrayList<Object>();

    if(inheritedClasses.size() > 1)
    {
        for(int i = 0; i < inheritedClasses.size(); i++)
        {
            Class c = inheritedClasses.get(i);
            try 
            {
                result.add(c.newInstance());
            } 
            catch (InstantiationException e) 
            {
                e.printStackTrace();
            } 
            catch (IllegalAccessException e) 
            {
                e.printStackTrace();
            }
        }
    }

    return result.toArray();
}

}

这绝对不是一个好的解决方案,但它是本机Java唯一可行的解​​决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM