Esiste comunque la possibilità di sovrascrivere un metodo in fase di esecuzione? anche se richiede la creazione dinamica di una sottoclasse da quell'istanza?è possibile sovrascrivere un metodo in fase di runtime?
risposta
Con Java semplice, no.
Con asm o cglib o aspectj, sì.
In semplice Java, la cosa da fare in una situazione del genere è creare un interface-based proxy che gestisce il richiamo del metodo e delega all'oggetto originale (o meno).
Vuoi dire qualcosa di simile: http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html
penso che non è possibile con semplici Java. Con la riflessione e/o il cgl probabilmente si può fare.
Guardate questi link:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
è possibile creare un anonymous class che l'override del metodo e utilizza il strategy pattern per decidere cosa fare.
Se siete alla ricerca di compilazione dinamica dal codice, è possibile seguire these instructions
Btw, ho usato la compilazione dinamica per implementare un framework di test con script in .NET. Ho letto uno script C# e ho composto una classe: "public class Test {public void Method() {" + userScript + "}}". Quindi ho appena creato il tutto e ho chiamato "Test.Method" usando il reflection proprio come nel link che ho inviato. –
Come altri hanno detto, no, non è possibile ignorare un metodo in fase di esecuzione. Tuttavia, a partire da Java 8 è possibile adottare l'approccio funzionale. Function
è un'interfaccia funzionale che consente di trattare le funzioni come tipi di riferimento. Ciò significa che è possibile crearne diversi e passare da uno schema di strategia a-la (dinamico).
Vediamo un esempio:
public class Example {
Function<Integer, Integer> calculateFuntion;
public Example() {
calculateFuntion = input -> input + 1;
System.out.println(calculate(10));
// all sorts of things happen
calculateFuntion = input -> input - 1;
System.out.println(calculate(10));
}
public int calculate(int input) {
return calculateFuntion.apply(input);
}
public static void main(String[] args) {
new Example();
}
}
uscita:
Non so in quali circostanze e design che si intende ignorare, ma il punto è che si sostituisce il comportamento del metodo, che è ciò che fa l'override.
- 1. È possibile ottimizzare un metodo enum non modificabile da JVM in fase di runtime?
- 2. Perché è possibile sovrascrivere un metodo protetto con metodo pubblico?
- 3. È possibile stabilire se un oggetto è attendibile in fase di runtime?
- 4. C# Reflection: è possibile trovare un'istanza di un oggetto in fase di runtime?
- 5. Come sovrascrivere la roba in un pacchetto in fase di runtime?
- 6. È possibile sovrascrivere un metodo statico nella classe derivata?
- 7. È possibile sovrascrivere un costruttore in C#?
- 8. È possibile scegliere un parametro di tipo generico C++ in fase di runtime?
- 9. è possibile assegnare una funzione a una variabile di classe in fase di runtime in php?
- 10. Come è possibile sovrascrivere un metodo java e modificare il nullability di un parametro?
- 11. È possibile eseguire una stringa di codice Java in fase di runtime in Android?
- 12. Caricamento XAML in fase di runtime?
- 13. È possibile sovrascrivere un campo tipo?
- 14. Modificare la locale in fase di runtime?
- 15. Come si accede a un metodo da un jar esterno in fase di runtime?
- 16. È possibile generare ed eseguire il codice Rust in fase di runtime?
- 17. È possibile convalidare xml contro xsd utilizzando il codice in fase di runtime?
- 18. È possibile aggiungere una directory al percorso della classe in fase di runtime?
- 19. è possibile sovraccaricare un metodo finale
- 20. Ha senso sovrascrivere un metodo in un'interfaccia
- 21. Come posso caricare un modulo Perl in fase di runtime?
- 22. È possibile sostituire un decoratore di funzione/metodo in fase di esecuzione? [Python]
- 23. Come sovrascrivere un metodo in base alla versione iOS del sistema di runtime?
- 24. È possibile ridimensionare il widget TextArea con il mouse in fase di runtime?
- 25. Scaricamento di un agente JVMTI in fase di runtime?
- 26. È possibile sovrascrivere un metodo con un parametro derivato anziché uno di base?
- 27. È possibile sovrascrivere un metodo nativo in una classe Java in Android/dalvik?
- 28. È possibile sovrascrivere #initialize in un modulo Ruby?
- 29. Come si calcolano i campi di un modello Django in fase di runtime?
- 30. È possibile leggere un file in fase di compilazione?
Perché? Cosa stai cercando di fare? – SLaks
@ Maxwell qual è il tuo ragionamento per voler fare questo? Sei in grado di determinare i dettagli del metodo solo in fase di esecuzione? –