首页 > 解决方案 > 加载同一类的版本(Java)

问题描述

我正在编写一个程序,让我的学生参与基本的 AI 游戏(类似于 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 - 如何加载同一个类的不同版本?

标签: javaclassloader

解决方案


您可以尝试使用compilation-toolbox,这个想法是您将尝试使用以下代码段加载每个学生 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" +
      "        }\n\n" +
       "    }";

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

推荐阅读