Czy ktoś wie, jak programowo dowiedzieć się, skąd faktycznie ładuje klasę Java?
Często pracuję nad dużymi projektami, w których ścieżka klas jest bardzo długa, a ręczne wyszukiwanie nie jest tak naprawdę opcją. Ostatnio miałem problem z tym, że moduł ładujący klasę ładował niepoprawną wersję klasy, ponieważ znajdowała się ona na ścieżce klas w dwóch różnych miejscach.
Jak więc zmusić moduł ładujący klasę do powiedzenia mi, skąd na dysku pochodzi właściwy plik klasy?
Edycja: Co powiesz na to, że jeśli moduł ładujący klasę faktycznie nie załaduje klasy z powodu niedopasowania wersji (lub czegoś innego), czy w każdym razie moglibyśmy dowiedzieć się, jaki plik próbuje odczytać przed odczytaniem?
java
classpath
classloader
Łukasz
źródło
źródło
Odpowiedzi:
Oto przykład:
Wydrukowano:
źródło
Test.class.getResource("Test.class")
która nie powtarza nazwy pakietu.Test.class.getResource(Test.class.getSimpleName() + ".class")
BouncyCastleProvider
pełnej nazwy pakietu jest jednak wymagane.getClassLoader()
zwrotunull
. Zobacz tutaj rozszerzenie tej metody do obsługi tego.Innym sposobem, aby dowiedzieć się, skąd ładowana jest klasa (bez manipulowania źródłem) jest uruchomienie wirtualnej maszyny Java z opcją:
-verbose:class
źródło
źródło
Z tego korzystamy:
Będzie to działać w zależności od implementacji ClassLoader:
getClass().getProtectionDomain().getCodeSource().getLocation()
źródło
Wersja Jona kończy się niepowodzeniem, gdy obiekt
ClassLoader
jest zarejestrowany jako,null
co wydaje się sugerować, że został załadowany przez BootClassLoader
.Ta metoda rozwiązuje ten problem:
źródło
Edytuj tylko pierwszą linię:
Main
.classWynik:
Może zły styl, ale działa dobrze!
źródło
Zazwyczaj nie robimy tego, czego używać na stałe. Możemy najpierw uzyskać className, a następnie użyć ClassLoader, aby uzyskać URL klasy.
źródło
Spójrz na to podobne pytanie. Narzędzie do odkrywania tej samej klasy ..
Myślę, że najistotniejszą przeszkodą jest posiadanie niestandardowego modułu ładującego klasy (ładowanie z db lub ldap)
źródło
Prosta droga:
Nasz przykład:
Lub
Nasz przykład:
źródło
To podejście działa zarówno w przypadku plików, jak i słoików:
źródło
Zakładając, że pracujesz z klasą o nazwie
MyClass
, powinny działać następujące czynności:To, czy można uzyskać lokalizację pliku .class na dysku, zależy od samego programu ładującego klasy. Na przykład, jeśli używasz czegoś takiego jak BCEL, pewna klasa może nawet nie mieć reprezentacji na dysku.
źródło