2016-03-22 16 views
2

Ich kann das Verzeichnis der Datei abrufen/erstellen, aber Probleme beim Zurückgeben des richtigen Datentyps.Ein Spiel in Java programmieren. Ich muss Klassen-Dateien aus einem verwandten Verzeichnis lesen und ein Objekt aus diesen

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

erstellt das Verzeichnis ./Zones/(an ganze Zahl wie 1)/(random) .class- aber ich habe keine Ahnung, wie in den Informationen für den Zugriff auf das Verzeichnis (Vergangenheit so etwas wie ein Textdokument)

Beispiel einer bestandene Klassendatei

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

die Klassendateien auf diese Weise erstellt werden muß, und es muss eine zufällige Datei aus dem Verzeichnis zurückkehrt, ist dies ein Klasse-Projekt, wo andere Menschen zu b haben Ich bin in der Lage, ihre eigenen Klassen zu erstellen und sie zu meinem Code hinzuzufügen, und ich möchte nicht, dass Leute meine Quelldateien ändern müssen.

Ja, alle Dateien, auf die ich zugreifen möchte, sind kompiliert.

aktuelle Version von 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; 
} 

das Problem dabei ist, dass es ClassNotFoundException im Läufer (gleiches Verzeichnis wie die Begegnung Klasse) gibt

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) 

mit der Linie

 fighter e = fighter.class.cast(t.rndmFighter(1)); 

zu ac verlasse die Methode.

+4

Namenskonventionen bitte: PascalCase für Klassennamen verwenden. – bcsb1001

+0

Was ist der Zweck von hier? Warum nicht einfach 'new File (". ")'? – BevynQ

+0

Ich muss in der Lage sein, mit Kämpfer-Objekten innerhalb des Verzeichnisses _/home/user/Dokumente/Text Adventure/Zonen/1/Feind/class file_ aus dem Verzeichnis _/home/user/Dokumente/Text Adventure_ – xcannibalrabbit

Antwort

0

ich mein Problem mit 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; 
} 

Dieses System gelöst haben mir erlaubt, die erforderlichen .class-Dateien zu ziehen und die notwendigen Konstruktor zu erstellen. Danke für die Hinweise: D

0

Es ist nicht klar aus der Frage, ob Sie bereits kompilierte .class-Dateien oder Quellcode (.java-Dateien) erwarten. Für den späteren nehme ich an, dass Sie javax.tools.JavaCompiler benötigen, um .java-Dateien on the fly zu kompilieren. Zum Laden von .class-Dateien von Drittanbietern benötigen Sie Folgendes:

Sind Sie nicht mit Sicherheitsproblemen beschäftigt? Was passiert zum Beispiel, wenn ein Code eines Drittanbieters den Aufruf System.exit() enthält und Sie ihn irgendwann aufrufen?

+0

Die Menschen, die Ich habe Zugang zu diesem System sind bekannt und lokal, ich möchte nur das System leicht mit ihnen auf der Seite zu interagieren. – xcannibalrabbit

+0

arbeitete tatsächlich, um dieses System zu implementieren, aber der Runner gibt _ClassNotFoundException_ mit meinem aktuellen Update zurück – xcannibalrabbit