Java-Iterate+;实例化类的目录

Java-Iterate+;实例化类的目录,java,file,class,object,dynamic,Java,File,Class,Object,Dynamic,我有一个名为Intent的Java类。在一个名为Intent的目录中,我定义了几个Intent的子类。现在,在我的runner类中,我想将每个子类实例化为一个数组列表,如下所示: public static String parseTranscript(String transcript) { ArrayList<Intent> intents = new ArrayList<Intent>(); File[] intentFiles = new Fil

我有一个名为
Intent
的Java类。在一个名为
Intent
的目录中,我定义了几个
Intent
的子类。现在,在我的runner类中,我想将每个子类实例化为一个数组列表,如下所示:

public static String parseTranscript(String transcript) {
    ArrayList<Intent> intents = new ArrayList<Intent>();

    File[] intentFiles = new File("./intents").listFiles();
        for (File fileName : intentFiles) {
          //for each of the intents defined in "intents/", 
          //create a new class and add to the array list.

          //intents.add(new fileName.ObjectName()); 
        }
  }

我们的目标是这样做,而不必手动定义runner中的每个子类。

您可以这样尝试。使用
Class.forName
,然后检查
getSuperclass
是否返回
Intent

ArrayList<Intent> intents = new ArrayList<Intent>();
String pathName = "./intents";
File[] intentFiles = new File(pathName).listFiles();
for (File fileName : intentFiles) {
    if (fileName.isFile() && fileName.getName().endsWith(".class")) {
        String className = packageName + '.' + fileName.getName().substring(0, fileName.getName().length() - 6);
        Class<?> aClass = Class.forName(className);
        if (aClass.getSuperclass().equals(Intent.class)) {
            Constructor<?> firstConstructor = aClass.getConstructors()[0];
            Intent o = (Intent) firstConstructor.newInstance(null);
            intents.add(o);
        }
    }
}
要获得正确的构造函数,可能需要在以下方面进行更改:

Constructor<?> firstConstructor = aClass.getConstructors()[0];
Constructor firstConstructor=aClass.getConstructors()[0];

这取决于您运行的环境。一般来说,作为基线,我建议查看。
String pathName = Thread.currentThread().getContextClassLoader()
        .getResources("intents").nextElement().getFile();
Constructor<?> firstConstructor = aClass.getConstructors()[0];