2014-04-04 58 views
0

我在java中实现了一个名为“ExerciseMovement”的抽象类,它实现了Runnable,并且具有扩展实现run()方法的抽象类的具体类。在我的客户端代码中,我试图创建一个代码来创建扩展抽象类并启动其线程的所有类的对象。我不确定在没有真正知道什么类扩展抽象类的情况下我能做到这一点。可能吗?创建在java中扩展抽象类的所有类的对象

+0

也许类似[this](http://stackoverflow.com/questions/205573/at-runtime-find-all-classes-in-a-java-application-that-extend-a-base-class)可以帮你? – Stefan

+0

这[很简单](http://code.google.com/p/reflections/)。虽然我会建议你使用线程池而不是原始的'Thread'。 –

回答

0

我不认为Java有这样的机制。你可以做的是在ExerciseMovementRegister上注册每个实现的类,它可以给你一个类的列表。这需要在静态块中完成(这是不理想的)。为他们创造的对象是微不足道的,然后(伪代码,而不是编译!):

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

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

这不是一个'List >'? –

+0

正确,我会更新,谢谢! – Martin

+0

你也有一个原型在'for(Class'。 –

-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

+0

你必须'@SuppressWarnings(“rawtypes”)''显示你正在做某件你不该做的事情。**从不**使用rawtypes。 –

+0

你可以改用?extend ExerciseMovement – Shadow3097

1

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

这个问题有两种临时解决方案。

  1. 扫描整个类路径:
    为了这个目的,你可以使用Reflections library

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

    你会在2行中得到你想要的。
    现在创建对象和启动线程很容易。

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

    虽然很容易做到,但它不适用于所有的子类。只有小类其中已经已被加载类加载器将提供给你。

希望这会有所帮助。