Jak można sprawdzić, czy istnieje metoda dla klasy w Javie? Czy instrukcja try {...} catch {...}
będzie dobrą praktyką?Jak sprawdzić, czy metoda istnieje w środowisku wykonawczym w Javie?
Odpowiedz
Zakładam, że chcesz sprawdzić metodę doSomething(String, Object)
.
Można spróbować to:
boolean methodExists = false;
try {
obj.doSomething("", null);
methodExists = true;
} catch (NoSuchMethodError e) {
// ignore
}
To nie zadziała, ponieważ metoda zostanie rozwiązany w czasie kompilacji.
Naprawdę potrzebujesz do tego celu refleksji. A jeśli masz dostęp do kodu źródłowego metody, którą chcesz wywołać, jeszcze lepiej jest stworzyć interfejs z metodą, którą chcesz wywołać.
[Aktualizacja] Dodatkowe informacje: Istnieje interfejs, który może istnieć w dwóch wersjach, starej (bez pożądanej metody) i nowej (z pożądaną metodą). Opierając się na tym, proponuję następujące:
package so7058621;
import java.lang.reflect.Method;
public class NetherHelper {
private static final Method getAllowedNether;
static {
Method m = null;
try {
m = World.class.getMethod("getAllowedNether");
} catch (Exception e) {
// doesn't matter
}
getAllowedNether = m;
}
/* Call this method instead from your code. */
public static boolean getAllowedNether(World world) {
if (getAllowedNether != null) {
try {
return ((Boolean) getAllowedNether.invoke(world)).booleanValue();
} catch (Exception e) {
// doesn't matter
}
}
return false;
}
interface World {
//boolean getAllowedNether();
}
public static void main(String[] args) {
System.out.println(getAllowedNether(new World() {
public boolean getAllowedNether() {
return true;
}
}));
}
}
testy Ten kod czy istnieje metoda getAllowedNether
w interfejsie, więc to nie ma znaczenia, czy rzeczywiste obiekty mają ten sposób, czy nie.
Jeśli metoda getAllowedNether
musi być wywoływana bardzo często i napotkasz problemy z wydajnością z tego powodu, będę musiał wymyślić bardziej zaawansowaną odpowiedź. Na razie powinno być dobrze.
Metoda nie znajduje się w moim kodzie, ale w połączonym słoiku - czy to zadziała? – jrtc27
Czy możesz powiedzieć, która to metoda? Czy metoda pochodzi z 'interfejsu', więc możesz po prostu zapytać o jego istnienie za pomocą operatora' instanceof'? –
kompilator przejdzie przez określone słoiki i znajdzie wszystkie metody, jeśli czegoś nie znajdzie, będzie narzekał z komunikatem o błędzie – Jaka
W języku Java nazywa się to odbiciem. Interfejs API umożliwia wykrywanie metod i wywoływanie ich w czasie wykonywania. Oto wskaźnik do dokumentów. To składnia dość rozwlekły, ale będzie to zadanie:
http://java.sun.com/developer/technicalArticles/ALT/Reflection/
Link nie działa. – mikiqex
Refleksja API wyrzuca NoSuchMethodException
podczas korzystania z funkcji Class.getMethod(...)
.
Inaczej Oracle ma ładny tutorial o refleksji http://download.oracle.com/javase/tutorial/reflect/index.html
użyłbym oddzielny sposób obsłużyć wyjątek i mają zerową kontrolę w celu sprawdzenia, czy metoda istnieje
Ex: if (NULL = getDeclaredMethod (obj, "getId", null)) zrób swoje rzeczy ...
private Method getDeclaredMethod(Object obj, String name, Class<?>... parameterTypes) {
// TODO Auto-generated method stub
try {
return obj.getClass().getDeclaredMethod(name, parameterTypes);
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
- 1. Jak ustalić, czy funkcja Perl istnieje w środowisku wykonawczym?
- 2. jak utworzyć klasę dynamiczną w środowisku wykonawczym w Javie
- 3. Jak sprawdzić, czy cmdlet istnieje w PowerShellu w środowisku wykonawczym za pomocą skryptu
- 4. Dodaj ostateczny modyfikator w środowisku wykonawczym w Javie
- 5. Czy istnieje metoda __equals w PHP, tak jak w Javie?
- 6. Jak sprawdzić czy element istnieje w tablicy w Javie
- 7. Rozmiar obiektu w środowisku wykonawczym
- 8. Dodawanie obrazu w środowisku wykonawczym
- 9. Jak sprawdzić, czy plik zasobów istnieje w Javie?
- 10. Jak zmienić AndroidManifest w środowisku wykonawczym?
- 11. włączyć HeapDumpOnOutOfMemoryError w środowisku wykonawczym
- 12. Konfiguracja hibernacji w środowisku wykonawczym
- 13. Sprawdzanie wersji modułu Python w środowisku wykonawczym
- 14. Dodawanie adnotacji Java w środowisku wykonawczym
- 15. Jak konwertować typy w środowisku wykonawczym?
- 16. Jak generować zasoby XML w środowisku wykonawczym w systemie Android?
- 17. Znajdź zależne pakiety w środowisku Eclipse w środowisku wykonawczym
- 18. Jak utworzyć findViewById parm dynamicznie lub programowo w środowisku wykonawczym
- 19. Sprawdź wersję systemu iOS w środowisku wykonawczym?
- 20. Jak określić rzeczywisty typ obiektu w środowisku wykonawczym w C++;
- 21. Uzyskiwanie danych wyjściowych procesu w środowisku wykonawczym
- 22. Java, sprawdź, czy plik wykonywalny istnieje w środowisku PATH
- 23. Wykryj przyspieszenie sprzętowe w środowisku wykonawczym: Android
- 24. Java: Rozszerzanie klasy w środowisku wykonawczym
- 25. Architektura wtyczek do załadowania w środowisku wykonawczym
- 26. Czy możesz wyjaśnić tę dziwaczną awarię w środowisku wykonawczym .NET?
- 27. Jak sprawdzić, czy istnieje klasa?
- 28. Określenie hierarchii klas obiektu w środowisku wykonawczym
- 29. Uzyskiwanie tożsamości podpisywania kodu w środowisku wykonawczym?
- 30. Tworzenie tabel dynamicznie w środowisku wykonawczym
Czy używasz refleksji? W przeciwnym razie nie jestem pewien, o co pytasz ... – Neil
Co próbuje/łowienie ma wspólnego z istnieniem metody? Chyba, że odnosisz się do sytuacji takiej jak w interfejsie 'Iterator', gdzie implementacja' remove' pozwala na wyrzucenie 'UnsupportedOperationException'? –
Jakie rodzaje sprawdzania istniejących metod mówisz? Odbicie? – Jaka