我在java中实现了一个名为“ExerciseMovement”的抽象类,它实现了Runnable,并且具有扩展实现run()方法的抽象类的具体类。在我的客户端代码中,我试图创建一个代码来创建扩展抽象类并启动其线程的所有类的对象。我不确定在没有真正知道什么类扩展抽象类的情况下我能做到这一点。可能吗?创建在java中扩展抽象类的所有类的对象
回答
我不认为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
你必须'@SuppressWarnings(“rawtypes”)''显示你正在做某件你不该做的事情。**从不**使用rawtypes。 –
你可以改用?extend ExerciseMovement – Shadow3097
知道所有的子类是不直接可能在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. Java的抽象类扩展两个类
- 2. 用Java中的抽象类扩展ArrayList?
- 3. 在Java中创建抽象类中的新对象
- 4. 抽象对象或创建类对象
- 5. 抽象类在PHP中扩展抽象类?
- 6. 如何从抽象类中创建扩展类?
- 7. 如何创建子类对象的java抽象类列表
- 8. 创建抽象类的对象 - 错误
- 9. Java:扩展对象类
- 10. 抽象类扩展的具体类
- 11. 在我上有一个抽象类的现有库扩展一个抽象类
- 12. 扩展抽象泛型类
- 13. 抽象基类扩展
- 14. 抽象类扩展Thread
- 15. 在PHP中,从基类实例创建扩展类的对象
- 16. 扩展另一个抽象类的php抽象类
- 17. 在Typescript中扩展抽象类
- 18. 在c中扩展抽象类#
- 19. 如果无法创建抽象类的新对象,抽象类中的非抽象方法有什么意义?
- 20. 一个对象可以在scala中扩展抽象类吗?
- 21. 创建抽象类
- 22. 创建抽象类
- 23. 为抽象类创建对象
- 24. 如何动态创建一个在PHP中扩展抽象类的匿名类?
- 25. C# - 抽象类扩展类和new()?
- 26. C++,在抽象类中创建匿名子类对象
- 27. 扩展Java类的Scala对象
- 28. JAVA - 创建抽象类的对象取决于参数
- 29. 按钮点击扩展抽象类操作的Java类
- 30. 抽象类扩展了多种类型的活动Java和Android
也许类似[this](http://stackoverflow.com/questions/205573/at-runtime-find-all-classes-in-a-java-application-that-extend-a-base-class)可以帮你? – Stefan
这[很简单](http://code.google.com/p/reflections/)。虽然我会建议你使用线程池而不是原始的'Thread'。 –