Получить значения параметров вызывающего метода
Как получить значения параметров вызывающего метода?
У меня есть сценарий, где есть два класса, а именно: класс A и класс B, содержащий два метода mthA(в классе A) и mthB(в классе B). mthA вызывает mthB. теперь я хочу знать в mthB, что все параметры были переданы в mthA. Это в основном для регистрации и обработки исключений. Я могу получить имя класса вызывающего класса, т. Е. Класса A, и имя метода, вызывающего mthB, т. Е. MthA. но я застрял в получении параметров mthA.
Thread.currentThread().getStackTrace()[1].getClassName()
это дает мне имя класса вызывающего метода, т.е. класса А.
Thread.currentThread().getStackTrace()[2].getMethodName()
Это дает мне имя метода вызывающего метода, т.е. mthA.
Если каким-то образом я могу получить сам метод целиком, тогда я могу получить параметры метода, переданные этому методу, используя getParameters().
4 ответа
Если это только для целей регистрации, то вы должны войти в систему mthA
Сам все аргументы передаются в метод.
Почему должен mthB
знать о mthA
Значения аргумента для обработки исключений? Если вы делаете это, то вам следует рассмотреть возможность рефакторинга кода и обработки исключений на соответствующих уровнях. Если значения переданы mthA
приводит к исключению, тогда оно должно быть обработано там перед вызовом mthB
,
Отражение только помогает в получении статической информации о классе и методах и не предоставляет значения времени выполнения аргументов, передаваемых в метод.
Почему бы вам не использовать какой-либо инструмент AOP, такой как AspectJ, для захвата этих значений и регистрации? Вы можете использовать точку выполнения () и совет после (). Для не производственного развертывания вы можете регистрировать все вызовы методов вместе с переданными значениями и возвращаемым значением. Это будет слишком много для производственной среды. Для этого вы можете просто сохранить переданные значения (Object args[], как вы получили в AspectJ advice) в локальной переменной и регистрировать их только в случае исключения. Но даже в этом случае произойдет некоторое снижение производительности, так как примитивные значения будут помещены в коробку для передачи как Object[] на ваш совет.
Нет простого способа получить значения аргументов вызывающего метода (если вы не можете изменить параметры вызываемого метода, чтобы включить и передать значения параметров вызывающего).
Используя некоторые API, например, предоставляемые Thread, мы можем получить статическую информацию, такую как имя класса / метода, но не информацию времени выполнения, такую как значения аргументов. Один из способов может заключаться в том, чтобы хранить и управлять такой информацией где-то и отображать ее при необходимости в случае регистрации / исключения. Я не думаю, что есть API для этого в Java.
Есть самый простой способ или нужно использовать Reflection..?
Если вы хотите знать, какой параметр передается для mthA
затем передать тот же параметр mthB
также пример:
mthA(1stParam, 2ndParam, ...){
mthB(1stParam, 2ndParam, ..., OtherParamertsForMthB);
...
}