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?


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.


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 .


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");

3

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.