我有一个名为" ExerciseMovement"的抽象类。在java中实现Runnable并具有扩展实现run()方法的抽象类的具体类。在我的客户端代码中,我尝试创建一个代码,该代码创建扩展抽象类并启动其线程的所有类的对象。我不确定我是否可以在不知道什么类扩展抽象类的情况下做到这一点。有可能吗?
答案 0 :(得分:1)
在java中无法直接了解所有子类。
这个问题有两个临时解决方案。
扫描整个类路径:
为此,您可以使用Reflections library。
Reflections reflections = new Reflections("my.package.prefix");
Set<Class<? extends ExerciseMovement>> subclasses = reflections
.getSubTypesOf(my.package.prefix.ExerciseMovement.class);
你可以在2行中得到你想要的东西 现在创建对象和启动线程很容易。
让每个类将自己(在静态块中)注册到基类(ExerciseMovement
)并维护所有子类的列表。
虽然很容易做到,但它并不适用于所有子类。只有子类已经已经 由类加载器加载。
希望这有帮助。
答案 1 :(得分:0)
我不认为Java有这种机制。你能做的是&#34;注册&#34;每个在ExerciseMovementRegister上实现的类,它可以为您提供类的列表。这需要在静态块中完成(这不是理想的)。为它们创建对象是微不足道的(伪代码,不编译!):
List<Class<? extends ExerciseMovement>> exerciseClasses = ExerciseMovementRegister.getClasses();
for(Class klass: exerciseClasses) {
ExerciseMovement move = (ExerciseMovement) klass.newInstance();
move.start();
}
答案 2 :(得分:-1)
您无法获得使用标准反射扩展超类的所有类。但是你可以用面向对象的方式解决这个问题:
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
的解决方案