Wie erhalte ich den aktuellen Klassennamen einschließlich des Paketnamens in Java?

82

Ich arbeite an einem Projekt und eine Anforderung ist, wenn das zweite Argument für die Hauptmethode mit " /" (für Linux) beginnt , sollte es als absoluter Pfad betrachtet werden (kein Problem), aber wenn es nicht mit "beginnt" /”Sollte der aktuelle Arbeitspfad der Klasse abgerufen und das angegebene Argument angehängt werden.

Ich kann den Klassennamen auf verschiedene Weise erhalten: System.getProperty("java.class.path"), new File(".")und getCanonicalPath(), und so weiter ...

Das Problem ist, dies gibt mir nur das Verzeichnis, in dem die Pakete gespeichert sind - dh wenn ich eine Klasse in " .../project/this/is/package/name" gespeichert habe , würde es mir nur " /project/" geben und den Paketnamen ignorieren, in dem das tatsächliche .class fileslebt.

Irgendwelche Vorschläge?

BEARBEITEN: Hier ist die Erklärung aus der Übungsbeschreibung

Sourcedir kann entweder absolut (beginnend mit "/") oder relativ zu dem Ort sein, von dem aus wir das Programm ausführen

Sourcedir ist ein gegebenes Argument für die Hauptmethode. Wie kann ich diesen Weg finden?

La bla bla
quelle
2
Was tun Sie, wenn der Code in einer JAR gepackt ist (oder sich ansonsten nicht in einer Ordner- / Dateistruktur befindet, wie Sie annehmen)? Es ist eine gefährliche Annahme; Dies mag für ein kleines Experiment, eine Klassenzuweisung oder eine andere verfügbare Situation gut funktionieren, aber BITTE gewöhnen Sie sich nicht an, diese Annahme für Code in Produktionsqualität zu treffen.
E-Riz
Es macht keinen Sinn, den Pfad zur Klassendatei zu finden. In der Übungsbeschreibung wird auch nicht erwähnt, dass, wenn Sie es sorgfältig lesen ( wo wir das Programm ausführen , der aktuelle Pfad ist, von dem aus das Programm vom Benutzer aufgerufen wird).
Der Nagel
Vielleicht könnten Sie mir helfen, die Anforderung besser zu verstehen? Ich muss überprüfen, ob das Argument mit einem '/' beginnt (Erwähnung in der Beschreibung). Wenn dies der Fall ist, verwenden Sie es einfach als absolut. wie es ist. aber wenn nicht, wie soll ich es behandeln?
La bla bla

Antworten:

166

Verwenden Sie this.getClass().getCanonicalName()diese Option , um den vollständigen Klassennamen abzurufen.

Beachten Sie, dass sich ein Paket- / Klassenname ("abC") vom Pfad der .class-Dateien (a / b / C.class) unterscheidet und dass die Verwendung des Paketnamens / Klassennamens zum Ableiten eines Pfads normalerweise eine schlechte Praxis ist. Sätze von Klassendateien / -paketen können sich in mehreren verschiedenen Klassenpfaden befinden, bei denen es sich um Verzeichnisse oder JAR-Dateien handeln kann.

Der Nagel
quelle
danke, aber es ist in der Hauptmethode, und 'dies' kann nicht in statischen Methoden verwendet werden. irgendeine Arbeit darum herum?
La bla bla
30

Es gibt eine Klasse Class, die das kann:

Class c = Class.forName("MyClass"); // if you want to specify a class
Class c = this.getClass();          // if you want to use the current class

System.out.println("Package: "+c.getPackage()+"\nClass: "+c.getSimpleName()+"\nFull Identifier: "+c.getName());

Wenn cdie Klasse MyClassim Paket dargestellt würde mypackage, würde der obige Code Folgendes ausgeben:

Paket: mypackage
Klasse: MyClass
Vollständige Kennung: mypackage.MyClass

Sie können diese Informationen verwenden, um sie nach Bedarf zu ändern, oder die API auf weitere Informationen überprüfen .

Jon Egeland
quelle
1
Beachten Sie, dass Class.forName ("MyClass") nur funktioniert, wenn es sich im Standardpaket befindet (dh keine Paketdeklaration hat).
Der Nagel
2
@TheNail true und getName()gibt den Paketnamen zusammen mit dem Klassennamen zurück, der jetzt bearbeitet wird.
Jon Egeland
Verwenden Sie getSimpleName()diese Option , um nur den Klassennamen ohne Paketnamen abzurufen.
Der Nagel
1
Stattdessen Class.forName("MyClass")sollten Sie verwenden, es MyClass.classsei denn, Sie benötigen aus einem anderen Grund wirklich eine Laufzeiterkennung.
mjaggard
12

Der vollqualifizierte Name wird wie folgt erhalten:

String fqn = YourClass.class.getName();

Sie müssen jedoch eine Klassenpfadressource lesen. Also benutze

InputStream in = YourClass.getResourceAsStream("resource.txt");
Bozho
quelle
3

verwenden this.getClass().getName()zu erhalten packageName.classNameund zu verwenden this.getClass().getSimpleName()bekommen nur Klassennamen

Md. Zahangir Alam
quelle