Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Стек-трейс / 4 сообщений из 4, страница 1 из 1
24.02.2013, 01:53:21
    #38163506
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стек-трейс
Каждый метод должен возвращать имя метода вызвавшего его, полученное с помощью стек-трейс.
Т.е. метод2 должен вернуть "method1", метод1 - "main". Подскажите как это сделать?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Solution2 {
    public static void main(String[] args) throws Exception
    {
        method1();
    }

    public static String method1()
    {
        method2();
        // код
        return ...;
    }

    public static String method2()
    {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        for(StackTraceElement element : stackTraceElements) {
            return element.getMethodName();       // не верно
        }
        return null;
    }
}
...
Рейтинг: 0 / 0
24.02.2013, 02:07:51
    #38163514
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стек-трейс
stackTraceElements[0] - текущий метод
stackTraceElements[1] - вызвавший метод

Если функцию переиспользовать в разных методах, то

stackTraceElements[0] - текущий метод - утилитный
stackTraceElements[1] - текущий метод - целевой
stackTraceElements[2] - вызвавший метод - искомый

Учтите что постоянное получение стэка сильно тормозит. Возможно проще было бы AOP прикрутить, или какую-то посткомпиляцию, чтобы имя метода передавалось параметром?
А для чего это всё?
...
Рейтинг: 0 / 0
24.02.2013, 10:31:27
    #38163572
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стек-трейс
Blazkowicz,
спасибо, это просто задача, и получается что метод вызвавщий текущий будет под вторым индексом:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Solution2 {
    public static void main(String[] args) throws Exception
    {
        method1();
    }

    public static void method1()
    {
        method2();
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        System.out.println("из метода 1: "+stackTraceElements[2].getMethodName());
        //return null;
    }

    public static void method2()
    {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        System.out.println("из метода 2: "+stackTraceElements[2].getMethodName());  // вызвавший
        //return null;
    }
}
...
Рейтинг: 0 / 0
01.03.2013, 00:43:05
    #38170377
rema174
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Стек-трейс
допустим нужно получить номер строки, откуда был вызван метод,
мой вариант такой, но как это можно сделать еще?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
public static void main(String[] args) throws Exception
    {
        method1();
    }

    public static int method1()
    {
        method2();
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        int ln=stackTraceElements[2].getLineNumber();
        //System.out.println(ln);
        return ln;
    }
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Стек-трейс / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]