Pracuję nad projektem i jednym z wymagań jest to, że drugi argument dla metody głównej zaczyna się od „ /
” (dla systemu Linux), powinien traktować go jako ścieżkę bezwzględną (nie jest to problem), ale jeśli nie zaczyna się od „” /
”, Powinien pobrać aktualną ścieżkę roboczą klasy i dołączyć do niej podany argument.
Mogę dostać nazwę klasy na kilka sposobów: System.getProperty("java.class.path")
, new File(".")
i getCanonicalPath()
, i tak dalej ...
Problem polega na tym, że to daje mi tylko katalog, w którym przechowywane są pakiety - tj. Jeśli mam klasę zapisaną w " .../project/this/is/package/name
", dałoby mi to tylko " /project/
" i ignoruje nazwę pakietu, w którym faktycznie znajduje się .class files
.
Jakieś sugestie?
EDYCJA: Oto wyjaśnienie zaczerpnięte z opisu ćwiczenia
sourcedir może być bezwzględne (zaczynając od „/”) lub względne w stosunku do miejsca, z którego uruchamiamy program
sourcedir jest podanym argumentem dla metody głównej. jak mogę znaleźć tę ścieżkę?
Odpowiedzi:
Użyj,
this.getClass().getCanonicalName()
aby uzyskać pełną nazwę klasy.Zwróć uwagę, że nazwa pakietu / klasy („abC”) różni się od ścieżki do plików .class (a / b / C.class) i że używanie nazwy pakietu / nazwy klasy do tworzenia ścieżki jest zazwyczaj złą praktyką. Zestawy plików / pakietów klas mogą znajdować się w wielu różnych ścieżkach klas, którymi mogą być katalogi lub pliki jar.
źródło
Jest klasa
Class
, która może 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());
Gdyby
c
reprezentował klasęMyClass
w pakieciemypackage
, powyższy kod wypisałby:Możesz pobrać te informacje i zmodyfikować je zgodnie z potrzebami lub przejść do interfejsu API, aby uzyskać więcej informacji.
źródło
getName()
zwraca nazwę pakietu wraz z nazwą klasy, edytując teraz.getSimpleName()
aby uzyskać tylko nazwę klasy bez nazwy pakietu.Class.forName("MyClass")
powinieneś używać,MyClass.class
chyba że naprawdę potrzebujesz wykrywania środowiska wykonawczego z innego powodu.W pełni kwalifikowana nazwa jest dostępna w następujący sposób:
Ale musisz przeczytać zasób ścieżki klas. Więc użyj
InputStream in = YourClass.getResourceAsStream("resource.txt");
źródło
użyj,
this.getClass().getName()
aby uzyskaćpackageName.className
i użyj,this.getClass().getSimpleName()
aby uzyskać tylko nazwę klasyźródło