簡體   English   中英

用Java編程游戲 我需要從相關目錄中讀取類文件,並返回從這些文件創建的對象

[英]Programming a game in java. I need to read class files from a related directory, and return an object created from those

我可以獲取/創建文件目錄,但是在返回正確的數據類型時遇到麻煩。

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這樣的整數)/(random).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();
    }
}

類文件必須以這種方式創建,並且必須從目錄中返回一個隨機文件,這是一個類項目,其他人必須能夠創建自己的類並將其添加到我的代碼中,而我不想人們不得不更改我的源文件。

是的,我嘗試訪問的所有文件都已編譯。

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;
}

問題是它在運行程序中返回ClassNotFoundException (與遇到類的目錄相同)

Exception in thread "main" java.lang.ClassNotFoundException: /home/user/Documents/Text Adventure/Zones/1/enemy/imp.class
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM