Biorąc pod uwagę pełną nazwę klasy, którą można załadować za pomocą Class.forName(), czy istnieje sposób na przekształcenie nazwy w wynik ładowania klasy i wywołanie metody getSimpleName() bez rzeczywistej próby załadowania klasa? Potrzebuję tej zdolności do celów refleksji.Jaki jest najlepszy sposób na przybliżenie class.getSimpleName() bez ładowania klasy?
Odpowiedz
Zamierzam powiedzieć, że nie można tego zrobić po prostu na podstawie nazwy.
Można spróbować podzielić na .
i $
, ale kod ten przykład pokazuje, że nie zawsze jest oczywiste, gdzie prosta nazwa zaczyna:
class Ideone
{
private static class Bar {};
public static void main (String[] args) throws java.lang.Exception
{
class Foo$o {
class Bar$bar {}
};
class Foo$o$Bar {
class Bar$bar {}
};
class Foo$o$Bar$Bar$bar {}
print(Ideone.class);
print(Bar.class);
print(Foo$o.class);
print(Foo$o.Bar$bar.class);
print(Foo$o$Bar.Bar$bar.class);
print(Foo$o$Bar$Bar$bar.class);
}
private static void print(Class<?> clazz) {
System.out.printf("fqn=%s, sn=%s%n", clazz.getName(), clazz.getSimpleName());
}
}
wyjściowa:
fqn=Ideone, sn=Ideone
fqn=Ideone$Bar, sn=Bar
fqn=Ideone$1Foo$o, sn=Foo$o
fqn=Ideone$1Foo$o$Bar$bar, sn=Bar$bar
fqn=Ideone$1Foo$o$Bar$Bar$bar, sn=Bar$bar
fqn=Ideone$2Foo$o$Bar$Bar$bar, sn=Foo$o$Bar$Bar$bar
tzn. Jeśli miałbyś powiedzieć "trochę imienia po ostatnim $
lub .
", mylisz się.
Jedynym rozstrzygający sposób, aby to zrobić, to załadować klasę, potencjalnie bez inicjalizacji:
Class<?> clazz = Class.forName(className, false, someClassLoadeR);
Albo wymyślić obszerny zestaw przypadków - jak wykazałeś, nie ma ich wiele - i wdrożyć go. Testowanie jednostkowe byłoby dość banalne. –
@BoristheSpider, ale możesz mieć zagnieżdżoną klasę o nazwie 'Fo' z klasą zagnieżdżoną o nazwie' o'. –
O tak, widzę - w lokalnej nazwie klasy znajduje się '1'. –
Jak wykazały odpowiedzią @AndyTurner nie można wyprowadzić prostą nazwę od wykwalifikowanego klasy String we wszystkich przypadki.
Ale jeśli ograniczenie bez faktycznie próbuje załadować klasę nie zabraniają, aby odczytać zawartość pliku klasy, można wykonać następujące czynności (dla przypadków brzegowych):
- Get
InputStream
dla zawartości pliku klasy poprzezClass.getResourceAsStream()
- Parsuj początek pliku klasy i przeczytaj nazwę super klasy z puli stałej.
- (zgodnie z komentarzem @shmosel) Implementacja logiki
Class.getSimpleName()
. Nazwa super klasy umożliwia zastąpienieClass.getSimpleBinaryString()
bazującej na już załadowanej klasie.
To uczucie jolly ciężko, a nie tylko ładowanie klasy. –
@AndyTurner PO będzie wiedział, czy to warte wysiłku. – wero
- 1. Jaki jest najlepszy sposób na skopiowanie listy?
- 2. Jaki jest najlepszy sposób na naukę Erlanga?
- 3. Jaki jest najlepszy sposób na seed srand()?
- 4. Jaki jest najlepszy sposób na naukę CUDA?
- 5. Jaki jest najlepszy sposób na wdrożenie "timera"?
- 6. najlepszy sposób przekierowywania/ładowania stron w PHP
- 7. Jaki jest najlepszy sposób przełączania zmiennej binarnej?
- 8. Jaki jest najlepszy sposób przejścia na kodowanie MVC?
- 9. Jaki jest najlepszy sposób testowania usług WCF?
- 10. Jaki jest najlepszy sposób na oczyszczenie obiektu w Javie?
- 11. Jaki jest najlepszy sposób zwiększania wyliczenia?
- 12. Najlepszy sposób na zapisanie do nsuserdefaults dla niestandardowej klasy?
- 13. Jaki jest najlepszy sposób na duplikowanie danych w szablonie django?
- 14. Jaki jest najlepszy sposób wyczyszczenia tablicy łańcuchów?
- 15. Jaki jest najlepszy sposób zamknięcia gałęzi Mercurial?
- 16. Jaki jest najlepszy sposób obsługi wielu działań?
- 17. Jaki jest najlepszy sposób profilowania wykonywania javascript?
- 18. Jaki jest najlepszy sposób wyszukiwania GitHub?
- 19. Jaki jest najlepszy sposób implementacji protokołów?
- 20. Jaki jest najlepszy sposób tworzenia wyszukiwania whois?
- 21. Jaki jest najlepszy sposób generowania mapy witryny?
- 22. Jaki jest najlepszy sposób na zbudowanie modelu widoku?
- 23. Jaki jest najlepszy sposób na uzyskanie równoległej nieskończonej pętli?
- 24. Jaki jest najlepszy sposób symulacji java.lang.Thread?
- 25. Lepsze przybliżenie ei Javy
- 26. Jaki jest najlepszy sposób uczenia się WCF?
- 27. Jaki jest najlepszy sposób przetestowania aplikacji szyny?
- 28. Jaki jest najlepszy sposób przetestowania narzędzia RedirectToAction?
- 29. Jaki jest najlepszy sposób wykonywania jQuery .change()
- 30. Jaki jest najlepszy sposób tworzenia wewnętrznych produktów?
Domyślam się, że musiałbyś zaimplementować logikę samodzielnie - jest to głównie pobieranie ostatniego elementu w '.' oddzielonym' String'; z pewnymi dzwonkami i gwizdami ... –
@BoristheSpider i ciąg może również zawierać '$' – wero
@wero yup, "dzwony i gwizdki" - jeśli to '\ $ \ d + $', to 'null', inaczej podzielone na' $ '. –