2010-01-20 15 views
5

È possibile richiamare il metodo di modifica non in una superclasse tramite la riflessione Java?Metodo di accesso alla riflessione Java con modificatore predefinito nella super classe

+0

Si noti che è importante specificare se il metodo che si sta tentando di richiamare è stato sovrascritto nella sottoclasse. Puoi invocare un metodo protetto da pacchetti (ovvero un accesso predefinito) tramite la riflessione? Sì. Puoi invocare un metodo sottoposto a override tramite reflection? No, verrà invocato il metodo di override. Le risposte qui sotto fanno ipotesi diverse su questo problema. –

risposta

1

Sì. Potrebbe essere necessario chiamare setAccessible (true) sull'oggetto Method prima di richiamarlo.

+0

getMethod e getDeclaredMethod hanno esito negativo se richiamati nella sottoclasse. e setAccessible non è richiesto. – Bozho

+0

Da quel commento credo che stai provando a chiamare un metodo con parametri. È necessario specificarli durante la ricerca del metodo. – Stroboskop

+0

Io non sono l'OP;) – Bozho

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

se si dispone di una gerarchia più grande, è possibile utilizzare:

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); 

(gli esempi di cui sopra sono per un metodo chiamato doSomething senza argomenti Se il metodo ha argomenti, si deve aggiungere il loro. tipi come argomenti al metodo getDeclaredMethod(...))

+1

Non sarebbe meglio tornare 'Metodo []' usando 'getDeclaredMethods()' e controllando se abbiamo un nome di metodo che corrisponde piuttosto che catturare l'eccezione? Non è quest'ultimo piuttosto lento perché una traccia di stack deve essere generata ogni volta? O sto ottimizzando prematuramente? :) –

+0

Stacktraces viene generato pigramente; se non lo richiedi, non viene generato. Puoi testare questo impostando un breakpoint nel metodo getOurStacktrace di Throwable e poi throwing ed exception. – Ajax

4

Dopo aver letto la domanda originale, mi rendo conto che ho pensato che stavi cercando di chiamare un metodo sottoposto a override. Che è quello che stavo cercando di fare e come sono arrivato a trovare questo thread. Chiamare un metodo non sovrascritto della classe base dovrebbe funzionare come gli altri qui descritti. Tuttavia, se si sta cercando di chiamare un metodo override, la mia risposta si pone come di seguito:

Non credo che chiama un metodo di override sia possibile, per

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

In particolare:

Method.invoke

Se il metodo sottostante è un metodo di istanza, viene richiamato utilizzando la ricerca del metodo dinamico come documentato in Java Language Specification, Second Edition, sezione 15.12.4.4; in particolare, si verificherà l'override in base al tipo di runtime dell'oggetto target.

Problemi correlati