È 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
risposta
Sì. Potrebbe essere necessario chiamare setAccessible (true) sull'oggetto Method prima di richiamarlo.
getMethod e getDeclaredMethod hanno esito negativo se richiamati nella sottoclasse. e setAccessible non è richiesto. – Bozho
Da quel commento credo che stai provando a chiamare un metodo con parametri. È necessario specificarli durante la ricerca del metodo. – Stroboskop
Io non sono l'OP;) – Bozho
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(...)
)
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? :) –
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
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.
- 1. Qual è il modificatore di accesso predefinito di una classe?
- 2. Modificatore di accesso alla sottoclasse C++?
- 3. Modificatore di accesso predefinito in C#
- 4. Accesso alla funzione di super classe utilizzando l'oggetto sottoclasse
- 5. Metodo di sovrascrittura che non ha modificatore di accesso con modificatore di accesso protetto
- 6. chiamata metodo di classe super super
- 7. Accesso alla variabile di classe esterna nella classe interna
- 8. a che cosa serve avere metodi pubblici quando la classe ha un modificatore di accesso predefinito?
- 9. Accesso alla classe 'Campi senza usare la riflessione?
- 10. C# impedisce che il metodo della classe base venga nascosto dal nuovo modificatore nella classe derivata
- 11. metodo di classe Super e interfaccia metodo predefinito di risoluzione dei conflitti
- 12. modificatore di accesso predefinito per enum in C#
- 13. char e byte con modificatore di accesso finale - java
- 14. Doxygen con modificatore di accesso interno C#
- 15. accesso alla variabile all'interno della classe interna in java
- 16. Ottieni proprietà private/Metodo di classe base con riflessione
- 17. Metodo di scarico nella classe Clip Java
- 18. chiamata metodo di classe Super automaticamente
- 19. Perché Java limita il modificatore di accesso di un metodo di nascondimento
- 20. chiamata metodo eccellente dall'interno super classe
- 21. Aggiungi il modificatore di accesso al metodo utilizzando Roslyn CodeFixProvider?
- 22. Classi nidificate locali Java e accesso a super metodi
- 23. Uso di Scala riflesso con riflessione Java
- 24. Accesso a una variabile privata della classe super() in Java - JChart2D
- 25. Parola chiave "super" nel metodo classe
- 26. java inner classes metodo accesso
- 27. Accesso alle variabili private in Java tramite la riflessione
- 28. Accesso alla classe controller FXML
- 29. Accesso alla smart card con Java
- 30. Come far riflettere Java per individuare i campi nella super classe? non solo la classe attuale
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. –