Загрузка версий одного и того же класса (Java)

Я пишу программу, позволяющую моим ученикам участвовать в элементарной игре с искусственным интеллектом (похожей на то, что IBM сделала много лет назад). Идея довольно проста. У каждого есть проект с игрой jar и своим AI-классом MyAI.java (который implements AbstractAI). Вся структура работает, они могут писать код в свой класс AI и отправлять его в общую папку. Структура папки после того, как несколько студентов отправили, следующая:

school/stud1/MyAI.class

school/stud2/MyAI.class

Я также написал код, который, как я думал (оглядываясь назад довольно наивно), загрузит и создаст экземпляры всех классов в ArrayList. Проблема в том, что я получаю ArrayList из x экземпляров текущего класса.

Я нашел несколько похожих вопросов, но принятые ответы в данном случае не сработали.

Некоторая часть класса Loader (не приукрашенная, это была просто демонстрация концепции) приведена ниже:

/**
* Load a single ai from a given location
* @param location  The path where the ai is: example: c:\\tourney
* @param className The complete class: "org.mrd.Tournament.MyAI"
* @return The instance of AbstractAI loaded
*/
public static AbstractAI loadAI(String location, String className){
    Object o = null;
    try {
        o = new URLClassLoader( new URL[]{new File(location).toURI().toURL()}
        ).loadClass(className).newInstance();
    } catch ...{
    }
    if (o == null) return null;
    return (AbstractAI)o;
}

/**
 * Load all current files in tournament folder.

 */
public static ArrayList<AbstractAI> loadCurrentTourneyFiles(){

      File dirs = new File("d:\\tourney\\school");
      //list of all file names
    ArrayList<String> names = new ArrayList<String>(Arrays.asList(dirs.list()));
    //Create an arraylist for all loaded AIs and load them.
    ArrayList<AbstractAI> arar = new ArrayList();
    for (String dir:names){
        arar.add(loadAI(dirs.getAbsolutePath() + "\\" + dir, "org.mrd.Tournament.MyAI"));
    }
      return arar;

}

Наиболее актуальные темы: Java ClassLoader: загрузить один и тот же класс дваждыJava - как загрузить разные версии одного и того же класса?

Пахнет проблемой XY. Должен быть лучший способ.

Nathan Hughes 05.05.2018 04:36

как насчет использования набор инструментов для компиляции

Adrian 05.05.2018 06:26

Вроде интересный проект, но я надеялся на более простое решение.

Teacherd 07.05.2018 03:21
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
3
57
1

Ответы 1

Вы можете попробовать использовать набор инструментов для компиляции, идея состоит в том, что вы попытаетесь загрузить каждую из студенческих банок с помощью следующего фрагмента:

 JavaSourceCompiler javaSourceCompiler = new JavaSourceCompilerImpl();
 JavaSourceCompiler.CompilationUnit compilationUnit = javaSourceCompiler.createCompilationUnit();
 compilationUnit.addClassPathEntry("ai_student1.jar");
 compilationUnit.addClassPathEntry("abstract_ai.jar");


  String aiProvider =  "package com.ai;\n" +
      "  import com.ai.student.AI;\n" +
        "import com.ai.AbstractAI;\n" + 
     "   public class AIProvider {\n" +
       "          public AbstractAI get() {\n" +
      "            return new AI();\n" +
      "        }\n\n" +
       "    }";

ClassLoader classLoader = javaSourceCompiler.compile(compilationUnit);
Class aIProvider = classLoader.loadClass("com.ai.Provider");

Другие вопросы по теме