Cześć.
W jaki sposób mogę mogę pobrać nazwę metody wywołującą inną metodę, mam na myśli taki przypadek: methodOneCallSecondMethod(secondMethod)
. W secondMethod
chciałbym pobrać np. nazwę metody jaka ją wywołała.
Thread.currentThread().getStackTrace()
i tam masz cały stos wywołań.
No to wiem, ale potrzebuję nazwę metody pobrać w tej drugiej metodzie, wywoływanej przez pierwszą
Inaczej, na przykładzie. Potrzebuję nazwy metody firstMethod
z metody secondMethod
public class Example {
StackTraceElement[] stackTraceElements;
public void firstMethod(int secondMethod) {
}
public int secondMethod() {
showStack();
return 0;
}
public void showStack() {
stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraceElements) {
System.out.println(element.toString());
}
}
}
Output:
java.lang.Thread.getStackTrace(Thread.java:1556)
com.company.Example.showStack(Example.java:20)
com.company.Example.secondMethod(Example.java:15)
com.company.Main.main(Main.java:7)
Matka wie że ćpiesz
? Przecież ty tutaj NIGDZIE nie wywołałeś w ogóle tego firstMethod
. Gdybyś jednak zrobił po ludzku:
public void firstMethod() {
secondMethod();
}
to ta nazwa pojawiłaby sie w stack trace.
Wie, ale się z tym pogodziła. Myślałem, że zrozumiesz mój zamysł.
public static void main(String[] args) {
Example example = new Example();
example.firstMethod(example.secondMethod());
}
No ale to jest bez sensu co zrobiłeś bo w chwili wywołania firstMethod funkcja secondMethod JUZ SIĘ ZAKOŃCZYŁA i dostajesz tylko jej WYNIK. Myśl trochę na nizszym poziomie, na poziomie bajtkodu/asemblera! To że jest jedna linijka nie ma znaczenia bo realistycznie ten kod to jest:
int tmp = example.secondMethod();
example.firstMethod(tmp);
A ty po prostu skróciłeś sobie zapis, co nie zmienia nijak semantyki tego co się dzieje. Siłą rzeczy secondMethod nijak nie moze przewidzieć gdzie jej wynik zostanie użyty. Oczywiście mógłbyś zrobic tak:
public class Example {
public void firstMethod(Supplier<Integer> secondMethod) {
secondMethod.get();
}
public int secondMethod() {
showStack();
return 0;
}
public void showStack() {
for (StackTraceElement element : Thread.currentThread().getStackTrace()) {
System.out.println(element.toString());
}
}
public static void main(String[] args) {
Example example = new Example();
example.firstMethod(example::secondMethod);
}
}
i wtedy dostaniesz taki efekt jakiego się spodziewasz, ale teraz semantyka jest inna, bo do funkcji firstMethod przekazaliśmy inną funkcje (secondMethod) i ta druga funkcja jest wywoływana w tej pierwszej.