Wie finde ich den Paketnamen bei einem Klassennamen?

8

Wie bekomme ich den Namen eines Pakets zur Laufzeit? Ich habe nicht den voll qualifizierten Namen mit Paketname + Klassennamen. Einfach nur der Klassenname.

Ich möchte, dass der Paketname in Class.forName() method verwendet wird.

Ich bin völlig in Ordnung mit der Suche nach dem ersten passenden Paketnamen (wenn mehrere Pakete die gleiche Klasse haben).

Irgendwelche Ideen?

AKTUALISIEREN

Ich habe keine Klasseninstanz, an der ich arbeiten könnte. Meine Anforderung besteht darin, eine Klasse mit der Methode Class.forName() zu erstellen. Aber ich habe einfach nur den Klassennamen als String. Ich brauche eine Möglichkeit, die Pakete zu durchlaufen und festzustellen, ob die Klasse, die ich habe, zu dem Paket gehört.

Der Stack-Trace der Ausnahme ist

%Vor%     
Ranhiru Cooray 05.01.2012, 13:03
quelle

5 Antworten

8

Dies ist höchstwahrscheinlich eine unglaublich ineffiziente, aufgeblähte, unbequeme Art und Weise, das zu tun, was Sie erreichen wollen, und hoffentlich gibt es bereits einen gebrauchsfertigen, einzigen Weg, es zu tun ... aber es sollte funktionieren .

Im Grunde sollten Sie jede Klasse im Klassenpfad durchsuchen, bis Sie eine Klasse gefunden haben, in der getSimpleName() mit dem Klassennamen übereinstimmt, den Sie haben.

Ich empfehle Ihnen, sich den Google Classpath Explorer anzuschauen, um die praktischen Schritte dabei zu verwalten. p>

Es könnte in etwa so aussehen:

%Vor%

resources ist ein Array von Strings wie 'com / foo / bar / Baz.class'. Sie können nun einfach durchgehen und übereinstimmende Einträge finden und diese von gestrichelten in punktierte, strip-out '.class' usw. umwandeln. Seien Sie vorsichtig bei der Suche nach inneren Klassen, da sie ein '$' Zeichen enthalten.

Soweit mir bekannt ist, werden diese Klassen NICHT geladen.

    
Grundlefleck 05.01.2012, 13:17
quelle
8
%Vor%     
Fortunato 05.01.2012 13:34
quelle
3

Der einzige Weg wäre, in den Verzeichnissen / jars in classpath und einem Eintrag mit dem Klassennamen zu navigieren.

Hier ist ein Code, der fast das tut, was Sie wollen. Dieser Code ist Teil einer Klasse, die nach Implementierungen / Factory-Methoden zum Erstellen von Instanzen von Schnittstellen sucht. Sorry, habe keine Zeit, dies zu ändern, um nach einer benannten Klasse zu suchen, sollte eine einfache Änderung sein, und wie ich an anderer Stelle erwähnt habe, musst du die Klasse nicht laden, überprüfe einfach den Namen.

%Vor%     
vickirk 05.01.2012 13:14
quelle
0

Eine der einfachsten Lösungen:

%Vor%     
Cristi B. 30.01.2015 09:43
quelle
0

Rufen Sie getPackageName () für die Klasse auf. Es gibt den vollständig qualifizierten Paketnamen zurück. Es ist auch erwähnenswert, dass dies ein Java 9-Feature ist.

    
Kaiser Keister 31.03.2018 21:01
quelle

Tags und Links