在 java 中编写游戏。我需要从相关目录中读取 class 文件,以及 return 从这些文件创建的对象
Programming a game in java. I need to read class files from a related directory, and return an object created from those
我可以 get/create 文件的目录,但是 return 无法输入正确的数据类型。
public fighter rndmFighter(int z) throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
fighter t = items[r].getName();
return t;
}
创建目录 ./Zones/(整数,如 1)/(随机)。class
但我不知道如何访问所述目录中的信息(过去类似于文本文档)
已通过 class 文件的示例
public class imp extends fighter implements monster {
private String name = "";
public imp(int health, int attack, int amr) {
super("imp", health, attack, amr);
randomName();
setGoldVal(4);
setDodge(15);
exp(3);
}
public imp() {
super("imp", (10 + (int) (Math.random() * 10)), 4 + (int) (Math.random() * 2), 0);
randomName();
setGoldVal((int) (Math.random() * 5));
setDodge(10 + (int) (Math.random() * 10));
exp(expVal());
}
public void Name(String n) {
n = name;
}
public void randomName() {
int x = (int) (Math.random() * 5);
switch (x) {
case 1:
name = "Zoryap";
break;
case 2:
name = "Yazkin";
break;
case 3:
name = "Azbis";
break;
case 4:
name = "Quzlop";
break;
case 5:
name = "Ziltik";
break;
default:
name = "Taylor Rogers";
break;
}
}
public int expVal() {
return 1 + (int) (Math.random() * 4);
}
public String toString() {
if (HP() < 0)
return name + ", the deceased imp.";
return name + super.toString();
}
}
class 文件必须以这种方式创建,并且必须 return 一个随机的
目录中的文件,这是一个 class 项目,其他人必须
能够创建自己的 classes 并将它们添加到我的代码中,但我不想
人们必须更改我的源文件。
是的,我尝试访问的所有文件都已编译。
rndmFighter() 的当前版本
public Object rndmFighter(int z)throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
path+="/"+items[r].getName();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class myClass = classLoader.loadClass(path);
Object t = myClass.newInstance();
return t;
}
这个问题是它 returns ClassNotFoundException 在运行器中(与遇到 class 相同的目录)
Exception in thread "main" java.lang.ClassNotFoundException: /home/user/Documents/Text Adventure/Zones/1/enemy/imp.class
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at encounter.rndmFighter(encounter.java:30)
at testGame.main(testGame.java:12)
使用线路
fighter e = fighter.class.cast(t.rndmFighter(1));
访问方法。
如果您期望已经编译的 .class 文件或源代码(.java 文件),则问题不清楚。对于以后,我想你需要 javax.tools.JavaCompiler
来即时编译 .java 文件。要即时加载第三方 .class 文件,您需要像这样的东西:
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class myClass = classLoader.loadClass(classNameToBeLoaded);
Object instance = myClass.newInstance();
您不担心安全问题吗?例如,如果第三方代码包含 System.exit() 调用并且您在某个时候调用它怎么办?
我已经使用 URLClassLoader 解决了我的问题
public Object rndmFighter(int z)throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
String s = items[r].getName().substring(0,items[r].getName().indexOf("."));
URL url = zone.toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class myClass = cl.loadClass(s);
Object t = myClass.newInstance();
return t;
}
这个系统允许我提取所需的 .class 文件并创建必要的构造函数。谢谢指点:D
我可以 get/create 文件的目录,但是 return 无法输入正确的数据类型。
public fighter rndmFighter(int z) throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
fighter t = items[r].getName();
return t;
}
创建目录 ./Zones/(整数,如 1)/(随机)。class 但我不知道如何访问所述目录中的信息(过去类似于文本文档)
已通过 class 文件的示例
public class imp extends fighter implements monster {
private String name = "";
public imp(int health, int attack, int amr) {
super("imp", health, attack, amr);
randomName();
setGoldVal(4);
setDodge(15);
exp(3);
}
public imp() {
super("imp", (10 + (int) (Math.random() * 10)), 4 + (int) (Math.random() * 2), 0);
randomName();
setGoldVal((int) (Math.random() * 5));
setDodge(10 + (int) (Math.random() * 10));
exp(expVal());
}
public void Name(String n) {
n = name;
}
public void randomName() {
int x = (int) (Math.random() * 5);
switch (x) {
case 1:
name = "Zoryap";
break;
case 2:
name = "Yazkin";
break;
case 3:
name = "Azbis";
break;
case 4:
name = "Quzlop";
break;
case 5:
name = "Ziltik";
break;
default:
name = "Taylor Rogers";
break;
}
}
public int expVal() {
return 1 + (int) (Math.random() * 4);
}
public String toString() {
if (HP() < 0)
return name + ", the deceased imp.";
return name + super.toString();
}
}
class 文件必须以这种方式创建,并且必须 return 一个随机的 目录中的文件,这是一个 class 项目,其他人必须 能够创建自己的 classes 并将它们添加到我的代码中,但我不想 人们必须更改我的源文件。
是的,我尝试访问的所有文件都已编译。
rndmFighter() 的当前版本
public Object rndmFighter(int z)throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
path+="/"+items[r].getName();
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class myClass = classLoader.loadClass(path);
Object t = myClass.newInstance();
return t;
}
这个问题是它 returns ClassNotFoundException 在运行器中(与遇到 class 相同的目录)
Exception in thread "main" java.lang.ClassNotFoundException: /home/user/Documents/Text Adventure/Zones/1/enemy/imp.class
at java.net.URLClassLoader.run(URLClassLoader.java:366)
at java.net.URLClassLoader.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at encounter.rndmFighter(encounter.java:30)
at testGame.main(testGame.java:12)
使用线路
fighter e = fighter.class.cast(t.rndmFighter(1));
访问方法。
如果您期望已经编译的 .class 文件或源代码(.java 文件),则问题不清楚。对于以后,我想你需要 javax.tools.JavaCompiler
来即时编译 .java 文件。要即时加载第三方 .class 文件,您需要像这样的东西:
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
Class myClass = classLoader.loadClass(classNameToBeLoaded);
Object instance = myClass.newInstance();
您不担心安全问题吗?例如,如果第三方代码包含 System.exit() 调用并且您在某个时候调用它怎么办?
我已经使用 URLClassLoader 解决了我的问题
public Object rndmFighter(int z)throws Exception
{
File here = new File("encounter.java");
String path = here.getAbsolutePath();
path = path.substring(0,path.lastIndexOf("/"));
path +="/Zones/"+z+"/enemy";
File zone = new File(path);
File[] items = zone.listFiles();
int r = (int)(Math.random()*(items.length));
String s = items[r].getName().substring(0,items[r].getName().indexOf("."));
URL url = zone.toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class myClass = cl.loadClass(s);
Object t = myClass.newInstance();
return t;
}
这个系统允许我提取所需的 .class 文件并创建必要的构造函数。谢谢指点:D