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.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
Thread.currentThread().getStackTrace()
i tam masz cały stos wywołań.
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)

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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.

- Rejestracja:około 21 lat
- Ostatnio:prawie 3 lata
- Lokalizacja:Space: the final frontier
- Postów:26433
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.

- Rejestracja:ponad 13 lat
- Ostatnio:prawie 3 lata
ShalomvpiotrShalomvpiotr