gpt4 book ai didi

java - 加载同一类的版本 (Java)

转载 作者:行者123 更新时间:2023-11-30 10:16:00 24 4
gpt4 key购买 nike

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

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 ClassLoader: load same class twice Java - how to load different versions of the same class?

最佳答案

你可以尝试使用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");

关于java - 加载同一类的版本 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50185142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com