JAVA: Klassen eines bestimmten Packages ermitteln (als Class[])

  • #1
M

Michael_B

Bekanntes Mitglied
Themenersteller
Dabei seit
21.09.2002
Beiträge
860
Reaktionspunkte
0
Ort
Köln
Hallöchen,

ich möchte aus einem meiner eigenen Packages dynamisch zur Laufzeit die in diesem befindlichen Klassen ermitteln. Muss ich dazu wirklich unbedingt mit java.io.* arbeiten (also Verzeichnisse durchsuchen etc.)? Warum hat die Klasse Package keine eigene Methode, die das macht?

Gibt es vll. noch ne andere Möglichkeit, das zu tun? Und was muss ich beachten, wenn ich davon ausgehen will, dass mein Package noch anderweitig verwendet wird?

Lg
M.
 
  • #2
Hi

Such mal nach Artikeln zu Java Reflection.
Das ist das was du suchst.

Gruß, Michael
 
  • #3
Hi,

Reflection ist mir geläufig. Umso mehr wundert es mich, dass es unter den vielen Methoden der Klasse Class keine vorhanden sind, die mir das Package liefert, in dem sich eine bestimmte Klasse (die man z. B. mit Class.forName(String s) ermittelt), befindet.
Meine Frage war, wie ihr bei der manuellen Programmierung einer solchen Methode vorgehen würdet. Ich suche also nach Empfehlungen ^^

Lg
M.
 
  • #4
Hi

Hab ich noch nie gebraucht, aber macht es so:
Code:
/*
     * Step 0: If our name contains dots we're in a package so put
     * that out first.
     */
    x = c.getName();
    y = x.substring(0, x.lastIndexOf(.));
    if (y.length() > 0) {
      System.out.println(package +y+;\n\r);
    }

Gruß, Michael
 
  • #5
Hups,

da ist mir bei meinem letzten Beitrag ein kleiner Flüchtigkeitsfehler unterlaufen. Es sollte natürlich eine Methode sein, die mir alle Klassen eines Packages listet. Es sollte daher so heissen: Umso mehr wundert es mich, dass es unter den Methoden der Klasse Package keine vorhanden sind, die mir die Klassen des Package liefert.
Aber dein Post ist dennoch nicht uninteressant für ein anderes Problemchen. Danke ^^

Meine Frage: Würde es ausreichen, die Verzeichnishierarchie zu durchlaufen bzw. gleich in einem bestimmten (dem jeweiligen Package entsprechenden) Verzeichnis die *.class Dateien zu listen und über diese an ein Class[] zu kommen? Oder könnte man da auch auf - mir dann noch unbekannte - Fehlerquellen stoßen?
Wie würdet IHR es machen?

Lg
M.

PS: Sorry nochmal wegen dem Fehler in meinem letzten Beitrag :)
 
  • #6
Hi

No Prob
Probleme könnte es mit Subklassen geben, da die ja auch als extra Class Dateien gespeichert werden.
Wozu brauchst du das denn genau? Evtl gehst du es ja von der falschen Seite an.

Edit: Hab beim stöbern gerade was gelesen dass man sich dafür wohl einen eigenen Classloader schreiben muss der dann die Klassen in dem Ordner lädt.

Gruß, Michael
 
  • #7
Hallo,

sorry, dass ich mich erst jetzt dazu melde... ging net früher. Also, wozu ich das brauche ist folgendes:
Ich schreibe ein Programm, indem ich mit Zahlen jongliere. Die Verarbeitungs-Methode, mit der die Zahlen jongliert werden, soll als Parameter (derzeit noch ein Consolen-Programm) übergeben werden. Der Wert dieses Parameters ist gleich dem Namen der Klasse, in der die entsprechende Verarbeitungsmethode drin ist. Alle diese Klassen implementieren ein bestimmtes Interface, was den ganzen Krempel einfacher macht. Ich kann dann die Klasse mit Class.forName(parameterwert) und einem getInstance() laden.

Gibt der dumme User aber nun einen unbekannten Wert für diesen Parameter ein (es wird also eine ClassNotFoundException ausgelöst) soll ein Hilfetext erscheinen. In diesem Hilfetext sollen alle derzeitig vorhandenen Verarbeitungsmethoden (bzw. deren Klassennamen) aufgelistet werden. Und diese Liste will ich halt dynamisch generieren, was es erforderlich macht, das Package, indem sich diese Verarbeitungs-Klassen befinden, zu durchsuchen...
Jetzt habich mal irgendwo aufgeschnappt, dass Package-Hierarchie nicht unbedingt immer gleich Verzeichnishierarchie sein muss, was mich allerdings ziemlich irritiert :)

Hoffe, das war halbwegs klar erläutert ^^

THX in advance
M.

EDIT: Ich habs bisher so umgesetzt. Setzt aber voraus, dass Pakethierarchie = Verzeichnishierarchie ist. Es wird zusätzlich geprüft, ob die geladenen Klassen das Interface Metrics implementieren. Am Ende bekomme ich ein Metrics[] zurück mit dem ich diese Hilfe-Liste erzeugen kann (brauche dazu die Metrics Objekte, weil innerhalb der jeweiligen Klassen noch der korrekt ausgeschriebene Name dieser Metrik ist.

Code:
public static Metrics[] loadAllMetrics() throws ClassNotFoundException, InstantiationException, IllegalAccessException {
		ArrayList arr = new ArrayList();
		
		String fs = System.getProperty(file.separator);
		String ps = .;
		String dirName = de+fs+com+fs+mbmmbu+fs+scoreCalculator+fs+metrics;
		String pckName = de+ps+com+ps+mbmmbu+ps+scoreCalculator+ps+metrics;
		
		Class metricsInterface = Class.forName(pckName+.Metrics);
		
		File dir = new File(dirName);
		if(dir.isDirectory()) {
			File[] files = dir.listFiles(new ClassFileFilter());
			for(int i=0; i<files.length; i++) {
				String s = files[i].getName();
				s = s.substring(0, s.lastIndexOf(.));
				s = pckName+.+s;
				Class tmp = Class.forName(s);
				Class[] interfaces = tmp.getInterfaces();
				if(interfaces.length>0) {
					boolean implementsMetrics = false;
					for(int k=0; k<interfaces.length && implementsMetrics==false; k++) {
						if(interfaces[k].equals(metricsInterface)) {
							implementsMetrics=true;
							arr.add((Metrics)tmp.newInstance());
						}
					}
				}
			}
		}
		
		Metrics[] aMetrics = new Metrics[arr.size()];
		for(int i=0; i<arr.size(); i++) aMetrics[i]=(Metrics)arr.get(i);
		
		return aMetrics;
	}

Aber irgendwie gefällt mir das alles nicht. ^^ hab auch das gefühl, dass ich da zu vorsichtig bin und alles mögliche abfrage, was evtl. gar nciht notwendig ist.
 
Thema:

JAVA: Klassen eines bestimmten Packages ermitteln (als Class[])

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.839
Beiträge
707.962
Mitglieder
51.492
Neuestes Mitglied
Janus36
Oben