[英]Create objects of all classes extending an abstract class in java
我在实现Runnable的Java中有一个名为“ ExerciseMovement”的抽象类,并有具体的类扩展了实现run()方法的抽象类。 在我的客户代码中,我试图创建一个代码,该代码创建扩展抽象类并启动其线程的所有类的对象。 我不确定是否可以在不知道哪些类扩展抽象类的情况下做到这一点。 可能吗?
在Java中不可能直接知道所有子类。
有两个临时解决此问题的方法。
扫描整个类路径:
为此,您可以使用Reflections库 。
Reflections reflections = new Reflections("my.package.prefix"); Set<Class<? extends ExerciseMovement>> subclasses = reflections .getSubTypesOf(my.package.prefix.ExerciseMovement.class);
您将在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.