2011-11-25 16 views
8

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?

+1

Perché? Cosa stai cercando di fare? – SLaks

+0

@ Maxwell qual è il tuo ragionamento per voler fare questo? Sei in grado di determinare i dettagli del metodo solo in fase di esecuzione? –

risposta

7

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

2

è 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

+0

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. –

0

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.

Problemi correlati