Java - Итерация + создание каталога классов - PullRequest
1 голос
/ 05 августа 2020

У меня есть класс Java под названием Intent. В каталоге с именем intents я определил несколько дочерних классов Intent. Теперь, в моем классе бегуна, я хотел бы создать экземпляр каждого из дочерних классов в списке массивов как таковых:

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()); 
        }
  }

Итак, если я правильно понимаю, мне нужно открыть каталог, получить все имена файлов, затем создайте объект из этого имени файла. Как лучше всего это сделать?

Файловая структура:

- Intent.java
- Main.java
- intents/
    - HelloIntent.java
    - GameIntent.java
    .
    .
    .

Цель состоит в том, чтобы без вручную определять каждый дочерний класс в runner .

1 Ответ

1 голос
/ 05 августа 2020

Можно так попробовать. С помощью 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);
        }
    }
}

Получение pathName было бы лучше сделать следующим образом:

String pathName = Thread.currentThread().getContextClassLoader()
        .getResources("intents").nextElement().getFile();

Может потребоваться правильный конструктор измените это:

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