Pobranie nazwy metody wywołującą inną metodę

0

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.

0

Thread.currentThread().getStackTrace() i tam masz cały stos wywołań.

0

No to wiem, ale potrzebuję nazwę metody pobrać w tej drugiej metodzie, wywoływanej przez pierwszą

0

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

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.

0

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

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1