2012-03-15 9 views
56

Pracuję nad projektem i jednym z wymagań jest, jeśli drugi argument dla głównej metody zaczyna się od "/" (dla systemu Linux) powinien traktować go jako bezwzględną ścieżkę (nie problem) , ale jeśli nie zaczyna się od "/", powinien pobrać bieżącą ścieżkę roboczą klasy i dołączyć do niej dany argument.Uzyskiwanie aktualnej nazwy klasy, w tym pakietu

mogę uzyskać nazwę klasy na kilka sposobów: System.getProperty("java.class.path"), new File(".") i getCanonicalPath(), i tak dalej ..

Problemem jest to tylko daje mi katalog, w którym przechowywane są pakiety - czyli jeśli mam klasa zapisana w ".../project/this/is/package/name", dałaby mi tylko "/ project /" i ignoruje nazwę pakietu, w którym znajdują się rzeczywiste pliki .class.

Wszelkie sugestie?

EDIT: Oto wyjaśnienie, wzięte z opisu ćwiczeń

SourceDir może być absolutny (zaczynające się od „/”) lub w stosunku do miejsca, gdzie możemy uruchomić program z

SourceDir jest argumentem dla głównej metody. jak mogę znaleźć tę ścieżkę?

+2

Co zrobisz, jeśli kod jest spakowany w JAR (lub w inny sposób nie jest w strukturze folderów/plików, jak zakładasz)? To niebezpieczne założenie; może to zadziałać dobrze w przypadku małego eksperymentu, przydziału klasowego lub innej sytuacji jednorazowej, ale PROSZĘ nie wdawać się w zwyczaj przyjmowania tego założenia w odniesieniu do kodu jakości produkcji. –

+0

Nie ma sensu znajdowanie ścieżki do pliku klasy.Również opis ćwiczenia nie wspomina o tym, że jeśli przeczytasz go uważnie (* gdzie uruchomimy program z * oznacza bieżącą ścieżkę, z której program jest wywoływany przez użytkownika). –

+0

Może mógłbyś mi pomóc lepiej zrozumieć ten wymóg? Muszę sprawdzić, czy argument zaczyna się od "/" (wzmianka w opisie). jeśli tak, po prostu użyj go jako absolutnego. jak jest. ale jeśli nie, jak mam to potraktować? –

Odpowiedz

112

Użyj this.getClass().getCanonicalName(), aby uzyskać pełną nazwę klasy.

Należy pamiętać, że nazwa pakietu/klasy ("abC") różni się od ścieżki plików .class (a/b/C.class) i że używanie nazwy pakietu/klasy do wyprowadzenia ścieżki jest różne zazwyczaj zła praktyka. Zestawy plików/pakietów klas mogą znajdować się w wielu różnych ścieżkach klas, które mogą być katalogami lub plikami jar.

+0

dziękuję, ale jest to metoda główna, a "to" nie może być używane w metodach statycznych. jakakolwiek praca wokół niego? –

+0

http://stackoverflow.com/questions/936684/getting-the-class-from-a-static-method-in-java –

+0

zredagował pytanie. w celu lepszego wyjaśnienia –

16

Istnieje klasa, Class, że można to zrobić:

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

Jeśli c reprezentował klasę MyClass w pakiecie mypackage, powyższy kod będzie drukować:

Opakowanie: mypackage
Klasa: MyClass
Pełny identyfikator: mypackage.MyClass

Możesz wziąć te informacje i zmodyfikować je w razie potrzeby lub przejść na stronę check the API, aby uzyskać więcej informacji.

+0

Należy zauważyć, że Class.forName ("MyClass") będzie działać tylko wtedy, gdy znajduje się w domyślnym pakiecie (tj. nie ma deklaracji pakietu). –

+1

@TheNail true, a 'getName()' zwraca nazwę pakietu wraz z nazwą klasy, edytując teraz. – Jon

+0

Użyj 'getSimpleName()', aby uzyskać tylko nazwę klasy bez nazwy pakietu. –

6

W pełni kwalifikowana nazwa jest opbtained następująco:

String fqn = YourClass.class.getName(); 

Ale trzeba czytać zasób ścieżce klasy. Więc użyjesz

Powiązane problemy