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 files
lebt.
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?
Antworten:
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.
quelle
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
c
die KlasseMyClass
im Paket dargestellt würdemypackage
, würde der obige Code Folgendes ausgeben:Sie können diese Informationen verwenden, um sie nach Bedarf zu ändern, oder die API auf weitere Informationen überprüfen .
quelle
getName()
gibt den Paketnamen zusammen mit dem Klassennamen zurück, der jetzt bearbeitet wird.getSimpleName()
diese Option , um nur den Klassennamen ohne Paketnamen abzurufen.Class.forName("MyClass")
sollten Sie verwenden, esMyClass.class
sei denn, Sie benötigen aus einem anderen Grund wirklich eine Laufzeiterkennung.Der vollqualifizierte Name wird wie folgt erhalten:
Sie müssen jedoch eine Klassenpfadressource lesen. Also benutze
InputStream in = YourClass.getResourceAsStream("resource.txt");
quelle
verwenden
this.getClass().getName()
zu erhaltenpackageName.className
und zu verwendenthis.getClass().getSimpleName()
bekommen nur Klassennamenquelle