Как я узнаю вызывающий класс? - PullRequest
3 голосов
/ 17 июня 2009

как я могу узнать, какой класс / метод вызвал фактический метод?

Ответы [ 6 ]

8 голосов
/ 17 июня 2009

Вы можете попытаться создать исключение, чтобы получить его трассировку стека.

Throwable t = new Throwable();
StackTraceElement[] stackTraceElements = t.getStackTrace();

Теперь stackTraceElement[0] содержит имя текущего метода.

Но будьте осторожны (из Throwable.getStackTrace () ):

Некоторые виртуальные машины могут, под некоторыми обстоятельства, пропустите один или несколько стеков кадры из стека трассировки. в крайний случай, виртуальная машина, которая не имеет информации о трассировке стека относительно этого броска разрешено вернуть массив нулевой длины из Этот метод. Вообще говоря, массив, возвращаемый этим методом, содержит один элемент для каждого кадра это будет напечатано printStackTrace.

5 голосов
/ 17 июня 2009

Вот один из способов, которым я воспользовался:

StackTraceElement element=Thread.currentThread().getStackTrace()[3];
String className=element.getClassName();
String methodName=element.getMethodName();

[3] жестко запрограммирован, потому что:

[0] - Thread.dumpThreads ()

[1] - Thread.getStackTrace ()

[2] - текущий метод

[3] - это предыдущий метод

1 голос
/ 18 июня 2009

Более быстрое, но непереносимое решение - использовать следующее. Он не создает трассировку стека, а просто дает вам необходимую информацию. Однако не все JVM будут иметь эту и будущую версию Java, возможно, тоже не будет.

Class callerClass = sun.reflect.Reflection.getCallerClass(2);
0 голосов
/ 17 июня 2009

Чтобы повторить и уточнить комментарии Мэтта Б и Ишая:

Если вы делаете это, потому что вы пишете регистратор или поддерживаете трассировочную информацию или что-то подобное, хорошо, круто. Я использовал трассировку стека в производственном коде ровно один раз, и даже это было действительно проблемой отладки: у нас была проблема с неправильным закрытием соединений с базой данных, поэтому я изменил функцию «получить соединение с базой данных», чтобы сохранить личность вызывающей стороны и затем периодически проверял наличие мертвых соединений и видел, где они были созданы.

Встроенная в Java функция ведения журналов выполняет трассировку стека, поэтому она может записать, кто вызвал регистратор, в файл журнала. Я беспокоюсь об этом, поскольку понимаю, что трассировка стека стоит дорого, но неважно.

Но если вы делаете это, потому что ваша функция будет вести себя по-разному в зависимости от того, откуда она была вызвана, например, «если вызывается из класса X, обновлять данные клиента, в противном случае вызывается из класса Y, обновлять данные сотрудника» или что-то подобное Действительно плохая идея. Передайте параметр или напишите отдельные функции.

0 голосов
/ 17 июня 2009

Вы можете использовать отладчик или профилировщик. В Netbeans есть и то и другое, но существует множество других вариантов.

Иначе, если вы можете изменить код, вы можете выдать новое исключение () и получить в стеке трассировку стека.

0 голосов
/ 17 июня 2009

Вы можете напечатать трассировку стека, чтобы сделать это.

Если вы хотите сделать это динамически, я не совсем уверен, возможно ли это (кроме печати и динамического анализа трассировки стека).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...