2011-08-14 15 views
11

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?

+0

Czy używasz refleksji? W przeciwnym razie nie jestem pewien, o co pytasz ... – Neil

+0

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'? –

+1

Jakie rodzaje sprawdzania istniejących metod mówisz? Odbicie? – Jaka

Odpowiedz

21

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.

+0

Metoda nie znajduje się w moim kodzie, ale w połączonym słoiku - czy to zadziała? – jrtc27

+0

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'? –

+0

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

2

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; 
} 
Powiązane problemy