Neue Java-Klasse zur Laufzeit finden

8

Ich habe eine Funktionalität, die ich einem Kunden für ein Software-Modell bereitstellen möchte, das wir gerade vorbereiten - und ich möchte wissen, ob es

ist
  1. möglich
  2. intelligent (alias nicht dumm)
  3. das Beste

Ich möchte, dass der Kunde in der Lage ist, eine Java-Klasse zu schreiben, die meine Computable -Schnittstelle implementiert und sie in einen vorgegebenen Ordner steckt. Dieser Ordner enthält die .java-Dateien anstelle von .class-Dateien. Zur Laufzeit möchte ich, dass mein Programm diesen Ordner durchsucht und alle Computables aus diesem Ordner extrahiert und sie in einer Map vom Namen des Computable zum Computable -Objekt speichert. Das Computable sollte nur einen Standardkonstruktor haben und das It-Interface wird nur eine Methode namens compute haben, die ein Array von Object auf ein Object abbildet.

    
JnBrymn 22.07.2010, 14:32
quelle

8 Antworten

9

Die Java Compiler-API wurde eingeführt in Java sollte SE 6 Ihnen geben, was Sie brauchen.

    
djna 22.07.2010, 15:01
quelle
3

Sie finden Google Reflections hilfreich, um Klassen zu finden, die eine bestimmte Schnittstelle / Oberklasse im Klassenpfad implementieren / erweitern. Es ist dann so einfach wie

%Vor%

Um zu testen, ob es tatsächlich einen no-arg-Standardkonstruktor gibt, prüfen Sie einfach, ob Class#newInstance() löst keine Ausnahme aus.

    
BalusC 22.07.2010 15:05
quelle
2

Es gibt mehrere Vorschläge, die als Antworten auf diese Frage .

Auch hier On-the-fly, speicherinterne Java-Code-Kompilierung für Java 5 und Java 6

    
David J. Liszewski 22.07.2010 14:54
quelle
1
  

Wenn es einfach ist, zur Laufzeit zu kompilieren, wäre das in Ordnung.

Sie können javax.tools um die Kompilation nach Bedarf durchzuführen. Erstellen Sie dynamische Anwendungen mit javax.tools , auch. Es ist auch möglich im Speicher zu speichern.

Eine Einschränkung: Die Verwendung des Compilers erzeugt eine Abhängigkeit vom JDK; Die JRE allein reicht nicht aus.

    
trashgod 22.07.2010 14:46
quelle
0
foret 22.07.2010 14:37
quelle
0

Ich denke das wäre einfacher, wenn Sie Ihren Kunden erlauben würden, eine Code-Deklaration mit Groovy einzugeben, die Java-isch genug ist und zur Laufzeit aus einem String-Wert einfach auszuführen ist.

    
Robert Munteanu 22.07.2010 14:39
quelle
0

Es ist einfach genug, die Liste der Dateien in einem Ordner zu durchlaufen. Jemand erwähnte, dass es möglich ist, den Java-Compiler von Java aus aufzurufen (wenn Sie das JDK neu verteilen, was meiner Meinung nach ein Punkt ist, dessen Rechtmäßigkeit geprüft werden muss!). Das ist ein großer Teil des Kampfes.

Sie scheinen ein festgelegtes Modell im Kopf zu haben, bei dem nur Dateien aus dem Ordner extrahiert werden, die eine bestimmte Schnittstelle erfüllen. Ich denke, das ist, wo Ihre Methode ein wenig geben muss. Der vernünftige Weg (IMO) wäre, alle Dateien in diesem Ordner zu kompilieren, und dann, wenn ihre Klassen irgendwo versteckt sind, können Sie sie laden und reflektieren und dann bestimmen, welche von ihnen "tun" die Schnittstelle und welche nicht. Jene, die das nicht tun, werden unnötigerweise in Ihre JVM geladen, aber wenn es nicht absichtlich sehr platzverschwenderisch ist, kann Code, den Sie nicht ausführen, Ihrem Programm nicht schaden.

Nachdem Sie bestimmt haben, welche die berechenbare Sache machen, können Sie diese Klassen (oder Instanzen davon) in einer Sammlung speichern und tun, was Sie wollen. Sie ignorieren einfach die anderen.

    
Carl Smotricz 22.07.2010 14:54
quelle
0

Sie könnten BeanShell verwenden. Diese Bibliothek ist klein und benötigt kein JDK. Es wird in einer Reihe von IDE- und Webservern verwendet. Die neueste Version scheint die Unterstützung zu haben, die Sie benötigen, um .java-Dateien aus dem Klassenpfad zu laden. (Noch in der Beta)

    
Peter Lawrey 24.07.2010 07:55
quelle

Tags und Links