2011-11-25 30 views

Odpowiedz

7

Z prostym Java, nie.

Z asm lub cglib lub aspectj, tak.

W zwykłej Javie, rzeczą do zrobienia w takiej sytuacji jest utworzenie interface-based proxy, która obsługuje wywołanie metody i deleguje do oryginalnego obiektu (lub nie).

2

Można by utworzyć anonymous class że przesłania metodę i używa strategy pattern zdecydować, co zrobić.

Jeśli szukasz dynamicznej kompilacji z kodu, można śledzić these instructions

+0

Btw, użyłem dynamicznej kompilacji do wdrożenia skryptowej platformy testowej w .NET. Przeczytałem skrypt C# i napisałem klasę: "public class Test {public void Method() {" + userScript + "}}". Potem po prostu zbudowałem całość i nazwałem "Test.Method" za pomocą refleksji, tak jak w linku, który wysłałem. –

0

Jak mówili inni, nie, nie można zastąpić metodę w czasie wykonywania. Jednak zaczynając od Javy 8, możesz zastosować podejście funkcjonalne. Function to funkcjonalny interfejs, który pozwala traktować funkcje jako typy odniesienia. Oznacza to, że możesz utworzyć kilka z nich i przełączać się między nimi (dynamicznie) wzorem strategii a-la.

Spójrzmy na przykład:

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

wyjściowa:

nie wiem, w jakich okolicznościach i konstrukcja zamierzają zastąpić, ale chodzi o to, że zastępujesz zachowanie metody, co robi to nadpisywanie.

Powiązane problemy