Czy mimo to można zastąpić metodę w czasie wykonywania? nawet jeśli wymaga dynamicznego tworzenia podklasy z tej instancji?czy można zastąpić metodę w czasie wykonywania?
Odpowiedz
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).
Masz na myśli coś takiego: http://cglib.sourceforge.net/apidocs/net/sf/cglib/Enhancer.html
myślę, że nie możliwe z prostego Java. Z odbiciem i/lub cglib prawdopodobnie możesz to zrobić.
Spójrz na te linki:
http://www.rgagnon.com/javadetails/java-0039.html
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
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
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. –
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.
Dlaczego? Co próbujesz zrobić? – SLaks
@Maxwell jaki jest twój powód, aby chcieć to zrobić? Czy możesz tylko określić szczegóły metody w czasie wykonywania? –