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




Вы можете попробовать использовать набор инструментов для компиляции, идея состоит в том, что вы попытаетесь загрузить каждую из студенческих банок с помощью следующего фрагмента:
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");
Пахнет проблемой XY. Должен быть лучший способ.