2010-01-20 5 views
5

Ist es möglich, die Methode no modifier in einer Superklasse durch Java-Reflektion aufzurufen?Java-Reflektionszugriffsmethode mit Standardmodifikator in der Superklasse

+0

Beachten Sie, dass Sie angeben müssen, ob die Methode, die Sie aufrufen möchten, in der Unterklasse überschrieben wurde. Können Sie über Reflektion eine paketgeschützte Methode (auch Standardzugriff genannt) aufrufen? Ja. Können Sie eine überschriebene Methode über Reflektion aufrufen? Nein, die überschreibende Methode wird aufgerufen. Die folgenden Antworten treffen unterschiedliche Annahmen zu diesem Thema. –

Antwort

1

Ja. Möglicherweise müssen Sie setAccessible (true) für das Method-Objekt aufrufen, bevor Sie es aufrufen.

+0

fail getmethod und getDeclaredMethod schlagen fehl, wenn sie für die Unterklasse aufgerufen werden. und setAccessible ist nicht erforderlich. – Bozho

+0

Von diesem Kommentar würde ich vermuten, dass Sie versuchen, eine Methode mit Parametern aufzurufen. Sie müssen diese beim Nachschlagen der Methode angeben. – Stroboskop

+0

Ich bin nicht das OP;) – Bozho

7
Method method = getClass().getSuperclass().getDeclaredMethod("doSomething"); 
method.invoke(this); 

wenn Sie eine größere Hierarchie haben, können Sie verwenden:

Class current = getClass(); 
Method method = null; 
while (current != Object.class) { 
    try { 
      method = current.getDeclaredMethod("doSomething"); 
      break; 
    } catch (NoSuchMethodException ex) { 
      current = current.getSuperclass(); 
    } 
} 
// only needed if the two classes are in different packages 
method.setAccessible(true); 
method.invoke(this); 

(die obigen Beispiele für ein Verfahren sind benannt doSomething ohne Argumente Wenn Ihre Methode Argumente hat, müssen Sie ihr hinzufügen. Typen als Argumente für die getDeclaredMethod(...) Methode)

+1

Wäre es nicht besser, 'Methode []' mit 'getDeclaredMethods()' zurück zu bekommen und zu überprüfen, ob wir einen Methodennamen haben, der eher übereinstimmt als die Ausnahme abzufangen? Ist letzteres nicht langsam, weil jedes Mal ein Stack-Trace generiert werden muss? Oder optimiere ich vorzeitig? :) –

+0

Stacktraces werden träge erzeugt; Wenn Sie es nicht anfordern, wird es nicht generiert. Sie können dies testen, indem Sie in der Methode getOurStacktrace von Throwable und dann throw und exception einen Haltepunkt setzen. – Ajax

4

Nach dem Lesen der ursprünglichen Frage - ich realisiere, nahm ich an, Sie versuchten, eine überschriebene Methode aufzurufen. Was ich versucht habe zu tun und wie ich diesen Thread gefunden habe. Das Aufrufen einer nicht überschriebenen Basisklassenmethode sollte funktionieren, wie andere hier beschrieben haben. wenn Sie eine überschriebene Methode aufzurufen jedoch versuchen, meine Antwort steht wie folgt:

Ich glaube nicht, eine überschriebene Methode ist möglich Aufruf pro

http://blogs.oracle.com/sundararajan/entry/calling_overriden_superclass_method_on

Vor allem:

Method.invoke

Wenn die zugrundeliegende Methode eine Instanzmethode ist, wird sie mit dynamischer Methodensuche aufgerufen, wie in The Java Language Specification, Zweite Ausgabe, Abschnitt 15.12.4.4; insbesondere wird das Überschreiben basierend auf dem Laufzeittyp des Zielobjekts stattfinden.

Verwandte Themen