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.