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