Klasse aus Package auslesen

Status
Nicht offen für weitere Antworten.
G

Gast2

Gast
Moin,

wie kann ich die Klassen aus einem Package wärend der Laufzeit auslesen?

mit etwas Glaskugel habe ich folgendes gefunden

Code:
	private void KlassenListe()
	{
        // Code from JWhich
        // ======
        // Translate the package name into an absolute path
		String pckgname = "de.x8bit.Fantasya.Atlantis.Items";
        String name = new String(pckgname);
        if (!name.startsWith("/")) {
            name = "/" + name;
        }        
        name = name.replace('.','/');
        
        // Get a File object for the package
        URL url = Launcher.class.getResource(name);
        File directory = new File(url.getFile());
        
        // New code
        // ======
        if (directory.exists()) {
            // Get the list of the files contained in the package
            String [] files = directory.list();
            for (int i=0;i<files.length;i++) {
                 
                // we are only interested in .class files
                if (files[i].endsWith(".class")) {
                    // removes the .class extension
                    String classname = files[i].substring(0,files[i].length()-6);
                    System.out.println(classname);
                }
            }
        }
	}

funktioniert super in Eclipse ... wenn ich das Projekt aber als JAR exportiere und starte, dann funktiniert es nicht ... und zwar läd er die Resource nicht

Code:
URL url = Launcher.class.getResource(name); // trööööt

starte ich das Projekt über die Console (also nicht als JAR) funktioniert es wieder



hand, mogel



 

Wildcard

Top Contributor
Das geht nicht. Ein Package ist kein Verzeichnis und in einem jar gibt es ebenfalls keine Verzeichnisse.
 
G

Gast2

Gast
Moin,

Ein Package ist kein Verzeichnis und in einem jar gibt es ebenfalls keine Verzeichnisse

das ist mir schon klar ... es funktioniert zwar, aber ich hätte gerne eine Java-Lösung ... daher auch meine Frage

hand, mogel
 

Wildcard

Top Contributor
Was meinst du mit java Lösung? Was du vorhast funktioniert nunmal nicht so wie du es gerne hättest.
 
G

Guest

Gast
Moin,

Was meinst du mit java Lösung?

das ich mittels Java wärend der Laufzeit mich durch die Packages "hangle", via Reflection ... so wie es mit dem .NET Framework funktioniert

Was du vorhast funktioniert nunmal nicht so wie du es gerne hättest

irgendwie schon ... ich bekomme ja die Klassen-Namen im entsprechenden Package ... unter Eclipse bzw. nur wenn das Projekt nicht als JAR gepackt ist ... der JAR-Browser liefert mir auch alle Klassen im Package ... allerdings liest er das JAR-File auch als ZIP aus

mein Problem ist, das ich zum einem mehre Packages habe die ich so durchlaufen muss ... zum Anderen werden je nach Fortschirtt verschiedene Klassen hinzugefügt ... da ich ja anscheinend nicht durch die Packages iterieren kann, muss ich das Ganze in eine extra Klasse auslagern und neue Klassen zu einer großen Liste von Hand hinzufügen ... und genau das möchte ich vermeiden (weil Regel #1: Programmierer sind faule Menschen)



hand, mogel
 

Wildcard

Top Contributor
Ein Package kann gar nicht wissen welche Klassen in ihm definiert sind, weil ein Package nichts anderes als ein Namespace ist.
Es ist nicht immer nur der einfache Fall alle Klassen von Package XY liegen in jar x oder noch besser, als Dateien in Verzeichnis YX.
Eine Klasse kann auch aus einem byte[] definiert werden, aus einer Datenbank, oder dem Netzwerk gestreamt werden und, und, und.
ich bekomme ja die Klassen-Namen im entsprechenden Package
Nein, du bekommst Dateien in einem Verzeichnis.
 
G

Gast2

Gast
Moin,

Wildcard hat gesagt.:
Ein Package kann gar nicht wissen welche Klassen in ihm definiert sind, [..]

theoretisch schon ... ist aber von Sun anscheinend nicht vorgesehen worden ... dazu müssen einfach nur die entsprechenden Meta-Daten verfügbar sein ... die VM verwaltet irgendwo in ihren Tiefen die ganzen Klassen passend zum Package ... nur darauf zugreifen darf anscheinend keiner

Es ist nicht immer nur der einfache Fall alle Klassen von Package XY liegen in jar x oder noch besser, als Dateien in Verzeichnis YX.

in meinem Fall schon, daher funktioniert auch ..........

Nein, du bekommst Dateien in einem Verzeichnis.

....... der Zugriff auf den Datei Namen ... da die VM vorrausetzt das Dateiname und Klassenname gleich sind ... ich weis nicht ob Du schon unter Windows versuchst hast eine Klasse zu verwenden wärend der Dateiname klein geschrieben ist aber die Klasse mit einem großen Buchstaben anfängt ... das funktioniert nicht



Fazit: unter Java funktioniert das Auslesen der Packages, wie unter .NET, mittels Reflection nicht ... das Auslesen der JAR/ZIP bzw. Verzeichnisstruktur funktioniert bedingt und erfüllt bei mir den Zweck



hand, mogel
 

Wildcard

Top Contributor
Du wirfst hier einiges durcheinander.
theoretisch schon ... ist aber von Sun anscheinend nicht vorgesehen worden ... dazu müssen einfach nur die entsprechenden Meta-Daten verfügbar sein ... die VM verwaltet irgendwo in ihren Tiefen die ganzen Klassen passend zum Package ... nur darauf zugreifen darf anscheinend keiner
Nein. Die bereits geladenen und daher bekannten Klassen sind eine Teilmenge Menge der Klassen die im Lebenszyklus der Anwendung geladen werden. Die Information welche Klassen in das Package XY definiert wurden ist also (wie bei XML Namespaces) schlicht nicht vorhanden (auch bei .NET nicht).

....... der Zugriff auf den Datei Namen ... da die VM vorrausetzt das Dateiname und Klassenname gleich sind ... ich weis nicht ob Du schon unter Windows versuchst hast eine Klasse zu verwenden wärend der Dateiname klein geschrieben ist aber die Klasse mit einem großen Buchstaben anfängt ... das funktioniert nicht
1. Es gibt nicht die VM
2. Sollten wir hier von der SUN VM reden, dann setzt sie das definitiv nicht vorraus. (nur bestimmte Classloader tun das).
 
G

Gast2

Gast
Moin,



schön das ich das bei der Suche nicht gefunden habe ???:L ... naja ... muss ich mir was einfallen lassen das das Ganze irgendwie dynamisch funktioniert



Nachtrag:

was mir aber gerade einfällt ... da ja alle Klassen in dem Package (zumindest bei mir) von einer Oberklasse erben ... kann man das Ganze evt. als Plugins lösen ... damit habe ich die Liste die ich benötige ... und wunderbar dynamisch ist das Ganze auch ... welches Package die Klassen haben, ist ja eigentlich egal



hand, mogel



PS: Gebäudetypen habe ich in einem anderen Package ^^
 
G

Gast1337

Gast
Code:
/**
 * This class lists ALL (REALLY ALL!!!) classes the Java VM could load, 
 * by iterating over ALL! available JAR-Files and reading class information from there ...
 * I KNOW it's a hack, but there is no other way to get this information ...
 */
package java.damn;

import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import sun.misc.Launcher;

public class ClassLister {

	public static void main(String[] args) {
		for(Package p : Package.getPackages() ) {
			System.out.println("Package:" + p);
			String pn = "/" + p.getName().replace('.', '/');
			URL url = ClassLoader.class.getResource(pn);
			if(url!=null) {
				if(url.getProtocol().equals("jar")) {
					System.out.println("URL:" + url.toString());
					String jfn = url.getFile().substring(0, url.getFile().indexOf('!'));
					String jfp = url.getFile().substring(url.getFile().indexOf('!') + 2);
					System.out.println(jfp);
					
					try {
						JarFile jar = new JarFile(new File(new URI(jfn)));
						Enumeration<JarEntry> jee = jar.entries();
						while(jee.hasMoreElements()) {
							JarEntry je = jee.nextElement();
							if(!je.isDirectory() && je.getName().endsWith(".class") //&& je.getName().startsWith(jfp)
									) {
								try {
									Class<?> jec = Class.forName(je.getName().substring(0, je.getName().length() - 6).replace('/', '.'));
									System.out.println("Class:" + jec);
								} catch (ClassNotFoundException e) {
									// TODO Automatisch erstellter Catch-Block
									e.printStackTrace();
								}
							}
						}
					} catch (IOException e2) {
						// TODO Automatisch erstellter Catch-Block
						e2.printStackTrace();
					} catch (URISyntaxException e) {
						// TODO Automatisch erstellter Catch-Block
						e.printStackTrace();
					}
					continue;
				}
				File f;
				try {
					f = new File(url.toURI());
				} catch (URISyntaxException e1) {
					// TODO Automatisch erstellter Catch-Block
					e1.printStackTrace();
					continue;
				}
				File[] l = f.listFiles();
				for(File fc: l) {
					String fcn = fc.getName();
					if(fcn.endsWith(".class")) {
						fcn = fcn.substring(0, fcn.length()-6);
						try {
							Class<?> classinfo = Class.forName(p.getName() + "." + fcn);
							System.out.println("Class:" + classinfo.getName());
						} catch (ClassNotFoundException e) {
							// TODO Automatisch erstellter Catch-Block
							e.printStackTrace();
						}
					}
				}
			}
		}
		for(URL u : Launcher.getBootstrapClassPath().getURLs()) {
			System.out.println(u);
			try {
				JarFile jar = new JarFile(new File(u.toURI()));
				Enumeration<JarEntry> jee = jar.entries();
				while(jee.hasMoreElements()) {
					JarEntry je = jee.nextElement();
					if(!je.isDirectory() && je.getName().endsWith(".class")
							) {
						try {
							Class<?> jec = Class.forName(je.getName().substring(0, je.getName().length() - 6).replace('/', '.'));
							System.out.println("Class:" + jec);
						} catch (ClassNotFoundException e) {
							// TODO Automatisch erstellter Catch-Block
							e.printStackTrace();
						} catch (UnsatisfiedLinkError e) {
							// TODO Automatisch erstellter Catch-Block
							e.printStackTrace();
						}
					}
				}
			} catch (IOException e2) {
				// TODO Automatisch erstellter Catch-Block
				e2.printStackTrace();
			} catch (URISyntaxException e) {
				// TODO Automatisch erstellter Catch-Block
				e.printStackTrace();
			}
		}
	}

}

Dazu mal noch ein Hinweis: Man sollte sich im Klaren sein, dass dieser Source jegliche Klassen initialisiert und daher der Speicherverbrauch der Java-VM schnell gegen die Limits läuft. Wer also nur die Namen der Klassen brauch um dann nur nach einem bestimmten Muster zu entscheiden, ob eine bestimmte Klasse geladen werden soll, sollte den Teil Class.forName im Beispiel auskommentieren und statt jec den als Argument für forName angegebenen String ausgaben\weiterverarbeiten.

Ich hab nach dem Prinzip einen vollständigen Loader geschrieben, der automatisch anhand eines RegExp Klassen filtert und deren Namen zurückgibt. Die gesamten VM-Klassen brauchen dann etwa eine Sekunde zum Filtern. Man muss aber für eine sinnvolle Verwendung des Ganzen jeglichen zu ladenden Klassen eine Namenskonvention aufdrücken. Das vollständige Laden ALLER Klassen geht zumindest NICHT, sei denn man gibt seiner JavaVM vollen Speicherzugriff auf >1GB RAM ...
 
G

Gast2

Gast
Moin,

ick lasse jetzt die Ameise für mich arbeiten ... die erstellt mir eine Liste aller Klassen in dem Verzeichnis und dann habe die in einer Datei die ich einlesen kann ... damit kann ich auch leben bzw. arbeiten

hand, mogel
 

Wildcard

Top Contributor
@Gast1337
This class lists ALL (REALLY ALL!!!) classes the Java VM could load
Ist natürlich Unsinn. Es ist ja kein Problem alle Klassen aller jar Files im Classpath zu lesen, aber das muss noch lange nichts mit allen Klassen im laufenden System zu tun haben.
Klassen können on-thy-fly im Speicher erstellt und geladen werden, aus einer DB, oder aus dem Internet nachgeladen werden, mit eigenen Classloadern von Netzwerkfreigabe XY geladen werden und und und.
Ausserdem verwendest du Klassen aus dem sun Package, damit ist der Code sowieso schon nutzlos.
 
G

Gast1337

Gast
Dann sollte die JavaVM eine saubere Methode für solche Aufgaben anbieten.

Und zu deinem anderen Punkt: Wenn ich eine Klasse aus einer DB erstelle, so habe ich im Anschluss eine Referenz auf diese, die ich kurz registrieren kann. Gleiches gilt aus Netzwerk-Quellen. In meinem Source ging es ja darum, Klassen, die im Bootstrap-Code vorhanden sind, und deren Quelle also nicht ohne Weiteres direkt eine Klassen-Referenz liefern, aufzulisten; und dafür funktioniert der Code sehr gut.

Und bzgl. Sun-Package: Dann zeig mal nen besseren Weg auf :meld:

@Wildcard: Sinnlos Rumschwafeln und Leute belegen, die eine Lösung suchen oder anderen Versuchen Hinweise zu geben, wie es gehen kann, ist keine Art, sich in einem Forum zu verhalten ;-)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Klasse aus xyz.class Datei laden / package entfernen? Allgemeine Java-Themen 4
T auf Klasse in Default package zugreifen Allgemeine Java-Themen 10
L Package und Klassenname von aufrufender Klasse holen Allgemeine Java-Themen 2
M Methodenübersicht einer Klasse einsehen Allgemeine Java-Themen 14
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
Atten007 Java-Klasse auf macOS entpacken? Allgemeine Java-Themen 2
M Klasse durch Klassen Aufteilung verbessern, aber wo? Allgemeine Java-Themen 1
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
d.lumpi Aus Einer Klasse auf ein Objekt einer anderen Klasse Zugreifen Allgemeine Java-Themen 1
missy72 Klassen Eigene Klasse MessageWindow ähnlich der Alert Klasse Allgemeine Java-Themen 2
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
kanywayne Java programmieren: Polynom Klasse Allgemeine Java-Themen 4
L Die abzuleitende Klasse als Parameter übergeben Allgemeine Java-Themen 4
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
C Klasse mit Mockito simulieren Allgemeine Java-Themen 9
P einen public <Optinal String> in einer anderen Klasse mit einem Int vergleichen Allgemeine Java-Themen 2
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Thallius Key/Value Table in Klasse einlesen Allgemeine Java-Themen 14
S static in Interface und Klasse Allgemeine Java-Themen 2
W Was genau sind IOTools? Kann ich stattdessen nicht die Scanner Klasse verwenden? Allgemeine Java-Themen 3
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D javassist API Klasse in MethodCall ermitteln Allgemeine Java-Themen 8
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
J Builder Klasse mit Lombok bauen Allgemeine Java-Themen 2
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
M [SOAP] - Klasse aus WSDL ausschließen Allgemeine Java-Themen 2
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
X Klassen Klasse BreakIterator Allgemeine Java-Themen 6
R Arraylist in andere Klasse leiten und bearbeiten Allgemeine Java-Themen 10
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
E Socket Dynamische Klasse von ObjectOutputStream lesen. Allgemeine Java-Themen 8
M Matcher-Klasse findet match nicht Allgemeine Java-Themen 6
cool_brivk24 Variablen abfragen von Boolean von anderer Klasse Allgemeine Java-Themen 12
S Seltsames Ergebnis mit Date-Klasse Allgemeine Java-Themen 6
J int Werte in einer anderen Klasse in Arrays speichern Allgemeine Java-Themen 3
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
M Kapselung Modellierung von Intervallen: Klasse Interval Allgemeine Java-Themen 4
B Übernommene Variablen(werte) aus der Main-Klasse ändern? Allgemeine Java-Themen 9
ReinerCoder Klasse kann nicht public deklariert werden Allgemeine Java-Themen 2
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
J IndexOutOfBoundsException bei der Nutzung der Klasse Message von mime4j Allgemeine Java-Themen 5
P Array einer abstrakten Klasse Allgemeine Java-Themen 4
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
kodela Dynamisches Array in einer Klasse Allgemeine Java-Themen 5
M Was geschieht mit Java-Klasse, die aus ArrayList entfernt wird? Allgemeine Java-Themen 10
perlenfischer1984 Lombok Builder soll andere Klasse bauen Allgemeine Java-Themen 4
perlenfischer1984 Mit Lombok Builder Felder in Super Klasse füllen Allgemeine Java-Themen 12
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
K Mit Button neue Klasse öffnen Allgemeine Java-Themen 9
J Reflection mit Klasse und Subklasse Allgemeine Java-Themen 11
C Classpath Neue Klasse über einen Button ausführen Allgemeine Java-Themen 3
magdaStone Logikproblem Umschalten von booleans in anderer Klasse Allgemeine Java-Themen 7
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
C Abstrakte Klasse, lokale Variable-Problem Allgemeine Java-Themen 1
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
Messoras Klassen Sämtliche Variablen einer Klasse übernehmen Allgemeine Java-Themen 6
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
B Animierte Klasse schreiben - Wie? Allgemeine Java-Themen 9
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
F Try/catch über ganze Klasse Allgemeine Java-Themen 9
L Von ArrayList abgeleitete Klasse nur mit bestimmten Objekten füllen Allgemeine Java-Themen 1
so_ein_Komischer Erste Schritte java Math Klasse finden? Allgemeine Java-Themen 2
J beans.instantiate(): Klasse kann nicht instanziiert werden Allgemeine Java-Themen 2
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
F Methodenaufruf mit abgeleiteter Klasse als Arg... Allgemeine Java-Themen 10
M Klasse in separaten Thread ausführen.Wie genau? Allgemeine Java-Themen 2
A Best Practice Unterschied zwischen einer sauberen Dependency Injection und einer statischen Klasse Allgemeine Java-Themen 5
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Die Initialisierung von Feldern in ableitender Klasse erzwingen..? Allgemeine Java-Themen 16
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
M Variable außerhalb Klasse definierbar? Allgemeine Java-Themen 2
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F Enums als innere Klasse sinnvoll? Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
N Automatisches einfügen einer selbst generierten ID in Klasse mit Annotation Allgemeine Java-Themen 8
F Klassen Klasse bei Button klick öffnen Allgemeine Java-Themen 11
F OOP Datenbank-Klasse überall verfübar Allgemeine Java-Themen 2
E KeyCode in anderer Klasse speichern Allgemeine Java-Themen 2
B Klassen Eigene Klasse als Array benutzen Allgemeine Java-Themen 3
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben