Загрузка версий одного и того же класса (Java) - PullRequest
0 голосов
/ 05 мая 2018

Я пишу программу, позволяющую моим студентам участвовать в зачаточной игре ИИ (подобно тому, что 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 - как загрузить разные версии одного и того же класса?

1 Ответ

0 голосов
/ 05 мая 2018

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

 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...