Узнать каким методом был вызван метод java

Проверьте, был ли вызван метод внутри другого метода

Есть ли способ в Java, чтобы проверить, был ли определенный метод был вызван внутри другого метода? Я тестирую класс и метод, с которым у меня возникают проблемы с воспроизведением звука, и практически невозможно получить воспроизводимый аудиофайл (закрытый атрибут внутри внутреннего класса) без изменения кода. Однако способ, которым метод воспроизводит звуки, заключается в том, что он вызывает метод, который воспроизводит один звук (playSadMusic, playHappyMusic и т. Д.). Эти методы находятся в интерфейсе, для которого я должен создать фиктивный объект. Я немного застрял в том, как бы я точно начал тестировать это. Какие-нибудь мысли? Любые другие идеи о том, как я мог бы проверить это, кроме проверки, был ли вызван определенный метод, приветствуются.

Я использую JMock 2.6.0 и JUnit 4

public interface StockTickerAudioInterface

другой интерфейс, я должен создать макет для

public interface StockQuoteGeneratorInterface
public class StockQuoteAnalyzer < private StockTickerAudioInterface audioPlayer = null; private String symbol; private StockQuoteGeneratorInterface stockQuoteSource = null; private StockQuoteInterface lastQuote = null; private StockQuoteInterface currentQuote = null; public StockQuoteAnalyzer(String symbol, StockQuoteGeneratorInterface stockQuoteSource, StockTickerAudioInterface audioPlayer) throws InvalidStockSymbolException, NullPointerException, StockTickerConnectionError < super(); // Check the validity of the symbol. if (StockTickerListing.getSingleton().isValidTickerSymbol(symbol) == true)< this.symbol = symbol; >else < throw new InvalidStockSymbolException("Symbol " + symbol + "not found."); >if (stockQuoteSource == null) < throw new NullPointerException( "The source for stock quotes can not be null"); >this.stockQuoteSource = stockQuoteSource; this.audioPlayer = audioPlayer; > public double getChangeSinceLast() < double retVal = 0.0; if (this.lastQuote != null) < double delta = this.currentQuote.getLastTrade() - this.lastQuote.getLastTrade(); retVal = 100 * (delta / this.lastQuote.getLastTrade()); >return retVal; > public double getChangeSinceYesterday() < double delta = (this.currentQuote.getLastTrade() - this.currentQuote .getClose()); return 100 * (delta / this.currentQuote.getClose()); >public void playAppropriateAudio() < if ((this.getChangeSinceYesterday() >2) || (this.getChangeSinceLast() > 0.5)) < audioPlayer.playHappyMusic(); >if ((this.getChangeSinceYesterday() < -2) || (this.getChangeSinceLast() < -0.5)) < audioPlayer.playSadMusic(); >> > 

Источник

Как найти вызывающий метод с помощью stacktrace или reflection в Java

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

Читайте также:  График функции python задача

Использование StackTrace

StackTrace — это массив элементов StackTraceElement, каждый из которых представляет собой кадр в стеке вызовов. StackTrace можно получить с помощью метода Thread.currentThread().getStackTrace() . Например:

В данном примере в консоль будет выведен весь стек вызовов до момента вызова метода myMethod() . При этом самый первый элемент в этом массиве ( stackTraceElements[0] ) — это всегда метод getStackTrace() , а следующий за ним ( stackTraceElements[1] ) — это метод, из которого был вызван getStackTrace() . То есть, если хочется получить вызывающий метод, нужно обратиться к stackTraceElements[2] .

Использование Reflection

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

Однако, с помощью Reflection можно получить информацию о текущем методе, в котором вы находитесь. Это можно сделать с помощью следующего кода:

public void myMethod() < String methodName = new Object()<>.getClass().getEnclosingMethod().getName(); System.out.println(methodName); >

В этом коде создается анонимный объект и с помощью метода getEnclosingMethod() получается информация о методе, в котором создан этот анонимный объект. Но это не даст информацию о вызывающем методе.

Таким образом, для получения информации о вызывающем методе лучше всего использовать StackTrace. Использование Reflection в данном случае не даст необходимой информации.

Источник

как узнать, какой метод (java.class) вызвал текущий

Как мы узнаем, откуда поступил вызов из C (из класса A или класса B )?

Вы можете посмотреть на трассировку стека, но это редко бывает хорошей идеей (и относительно медленной). Вместо этого вы должны передать C всю важную информацию. Кстати, вы можете передать класс в качестве аргумента, например. init(A.class);

Технически это может быть интересно, но в целом код не должен зависеть от звонящего, он должен зависеть от его параметров.

4 ответа

Чтобы сделать это правильно, вы должны предоставить эту информацию методу C, например, через параметр перечисления или класса:

public void init(Object otherArg, Class caller)
public void init(Object otherArg, CallerEnum caller)

Но если вам все равно, есть другой способ использовать трассировку стека. Взгляните на Получите текущую трассировку стека в Java и используйте второй StackTraceElement из верхней части стека, чтобы получить метод, который вызвал текущий.

StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); 
  • вы можете использовать это, чтобы получить трассировку стека текущего потока в массиве StackTraceElement , где первый элемент массива является самой последней последовательностью вызова метода в стеке
  • при условии, что возвращаемый массив имеет ненулевую длину. StackTraceElement имеет такие методы, как getClassName , getMethodName и т. Д., Которые можно использовать для поиска имени класса вызывающего абонента или имени метода.
Читайте также:  Дополнение строки слева python

Взято откуда-то из Интернета .

private static final int CLIENT_CODE_STACK_INDEX; static < // Finds out the index of "this code" in the returned stack trace - funny but it differs in JDK 1.5 and 1.6 int i = 0; for (StackTraceElement ste : Thread.currentThread().getStackTrace()) < i++; if (ste.getClassName().equals(MyClass.class.getName())) < break; >> CLIENT_CODE_STACK_INDEX = i; > public static String getCurrentMethodName() < return Thread.currentThread().getStackTrace()[CLIENT_CODE_STACK_INDEX].getMethodName(); >public static String getCallerMethodName()

Я подозреваю, что разная глубина зависит от количества уровней вызова внутри getStackTrace, который вызывается до того, как будет сделан снимок. У разных продавцов тоже может быть по-разному.

Выполняется в классе X.foo — вернет «foo», статический блок предназначен для предотвращения упомянутой вами проблемы.

Я пытался объяснить, зачем нужен статический блок, поскольку у вас был комментарий funny but it differs in JDK 1.5 and 1.6

Я нашел более простое решение (для меня: D)

public void init(Class clazz) < if (!clazz.getSimpleName().equals("MyClassName")) < // do something >else < // do something >> 

Источник

Как в Java внутри статического метода определить, для какого класса был вызван статический метод?

Будут вызваны методы getCar () и makeCar () суперкласса Ferrari. Ferrari не может использовать @Override getCar (), потому что в Java статические методы нельзя переопределить.

Итак, в методе getCar () автомобиля, как я могу определить, был ли вызов метода отправлен в класс Ferrari, а не в класс Car? Поскольку это статический метод, очевидно, что я не могу использовать if(this instanceOf Car) .

РЕДАКТИРОВАТЬ: правильный ответ (ниже) показал мне, что я действительно не могу сказать изнутри автомобиля , запущен ли getCar () из-за того, что кто-то вызывает Car.getCar () или Ferrari.getCar ().

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

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

Это означает, что при переопределении, если бы это были не статические методы, функция makeCar () Ferrari всегда вызывалась из метода getCar () автомобиля в любое время, когда вызывающий объект вызывает myFerrariInstance.getCar (). Однако при сокрытии makeCar () Ferrari никогда не будет вызываться из метода getCar () автомобиля, потому что makeCar () также является статическим методом в том же классе.

Источник

Читайте также:  Абсолютное позиционирование

Как узнать откуда был вызван метод?

У меня после распознавания речи вызывается метод onActivityResult(). В нём речь преобразуется в String. После этого в зависимости откуда был вызван метод onActivityResult() нужно, чтобы выполнялось либо действие 1 либо действие 2. В onActivityResult вроде-бы нельзя передавать ещё какие-то параметры. Как это можно реализовать? Примерно набросал код.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public void first() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU"); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Говорите после сигнала!"); startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); } public void second() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, "ru-RU"); intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Говорите после сигнала!"); startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { ArrayListString> textMatchList = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); String question = textMatchList.get(0).toLowerCase(); if (first) { Действие 1; } if (second) { Действие 2; } super.onActivityResult(requestCode, resultCode, data); }

Как в отладке выяснить, откуда был вызван метод
Ребят как узнать откуда был вызван метод? К примеру ставлю точку останова на метод onCreate во.

Как узнать чем (каким Event) был вызван метод
Можно ли как-то узнать, каким Event ом или из какого класса был вызван метод?

Как узнать из какого потока был вызван метод класса находящегося в потоке?
Пример того как можно безопасно вызывать методы класса который в отдельном потоке.

Открытие попап там, откуда он был вызван
Доброе утро! проблема с открытием попап под той ссылкой, откуда попап был вызван. сейчас он.

Лучший ответ

Сообщение было отмечено hnvor как решение

Решение

ЦитатаСообщение от hnvor Посмотреть сообщение

Как узнать из какого объекта был вызван слот через QTimer::singleShot ?
Здравствуйте. Класс MainWindow, из которого вызов: MainWindow::MainWindow(QWidget *parent) .

Узнать, откуда вызван AJAX запрос
Здравствуйте. Есть JS скрипт, в котором реализованы AJAX-запросы. Там прописано (допустим).

Откуда быз вызван метод,свойство и т.п.
Хотелось бы узнать есть ли в php какая-то функция с помощью которой можно узнать откуда был вызван.

Источник

Оцените статью