加载同一类的版本 (Java)



我正在编写一个程序,让我的学生参与一个基本的人工智能游戏(类似于IBM几年前做的事情)。 这个想法很简单。 每个人都有一个游戏项目jar,他们的AI类MyAI.java(implements AbstractAI)。 结构都有效,他们可以将代码写入他们的 AI 类,并将其提交到公共文件夹。 一些学生提交后,文件夹的结构为:

school/stud1/MyAI.class
school/stud2/MyAI.class

我还编写了我认为(回想起来很天真)会将所有类加载并实例化到ArrayList的代码。 问题是,我最终得到了当前类的 x 个实例的ArrayList

我发现了一些类似的问题,但在这种情况下,接受的答案不起作用。

下面包含一些 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 类加载器:加载同一类两次 Java - 如何加载同一类的不同版本?

您可以尝试使用编译工具箱,其想法是尝试使用以下代码片段加载每个学生jar:

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" +
"        }nn" +
"    }";
ClassLoader classLoader = javaSourceCompiler.compile(compilationUnit);
Class aIProvider = classLoader.loadClass("com.ai.Provider");

最新更新