java - 加载同一类的版本(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;
}
解决方案
您可以尝试使用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");
推荐阅读
- google-cloud-platform - BigQuery 从列中删除 <0x00> 隐藏字符
- java - 如何在 Java 中将字符串转换为数组列表或数组
- php - HTTP 到 HTTPS 重定向在 WordPress 的 Apache+Varnish 中不起作用
- angular - 使用变量动态获取对象属性
- sql - 我们可以在默认的“sysssislog”日志表中添加一列,或者至少自定义它的消息吗?
- html - 无法在 Ionic Angular 中更新侧边菜单自定义滚动条
- python - 如何使用 String 实例插入 SQL 语句?
- python - Python Pandas - 根据其他列值选择列
- javascript - 如何在javascript中同时使用超时和中断
- ios - 启用 bicode 的 Firework ios sdk 存档错误