Java: как получить аргументы, переданные методу, который вызвал этот метод?
в java можно получить класс и метод, который вызвал текущий метод (метод, в котором вы получаете StackTrace).
мой вопрос в том, Могу ли я получить аргументы, которые были переданы методу, который вызвал этот метод?
Мне нужно это для целей отладки.
например:
baseClass {
initialFunc(input) {
var modifiedInput = input + " I modified you";
otherClass.doSomething(modifiedInput);
}
}
otherClass {
doSomething(input) {
//GET THE ARGUMENTS PASSED TO THE METHOD OF THE CLASS THAT CALLED THIS METHOD
}
}
можно ли получить эту информацию из stacktrace или есть другие средства?
(обратите внимание, что мне нужно иметь возможность сделать это во время выполнения и не может фактически изменить источник baseClass, это будет особенностью моего класса отладки, который не знает источник заранее)
спасибо.
5 ответов
Я не верю, что это возможно с помощью стандартного API Java.
то, что вы можете сделать, это использовать AspectJ, поместить точечный разрез в вызывающий метод, сохранить аргументы, поместить точечный разрез в вызываемый метод и передать аргументы.
другой вариант (немного более продвинутый)-использовать пользовательский загрузчик классов, который сохраняет исходные Аргументы и передает их в качестве дополнительных аргументов следующему методу. Это, вероятно, займет день или два, чтобы осуществлять. Подходящие рамки как bcel или ASM.
Я думаю, что это возможно, потому что input
выходит за рамки, но еще не доступен для сборки мусора, поэтому значение все еще существует, но, к сожалению, я не считаю, что есть способ API по умолчанию для доступа к нему. Это может быть возможно с помощью пользовательского реализованного NDC (вложенные диагностический контекст) для подхода лесозаготовки.
Я не уверен, почему вы когда-либо хотели бы сделать это на Java?
единственный способ, который я могу придумать, - создать пользовательский объект-оболочку для переданной строки, отправляя ссылку на оболочку вместо новой строки каждый раз.
Я бы посоветовал против этого, поскольку он загромождает ваш исходный код и делает его еще более подверженным ошибкам.
может ли эта проблема не быть решена с помощью отладчика, например встроенного в eclipse, для проверки вашего состояния?
вы можете получить имя вызывающего метода и его класса, но вам нужно добавить код в текущий метод:
public static void main(String[] args) throws Exception {
call();
}
private static void call() {
Exception exception = new Exception();
for(StackTraceElement trace : exception.getStackTrace()){
System.out.println(trace.getMethodName());
}
}
это напечатает "вызов " и" main", имя методов в вызываемом порядке (обратный).
это возможно с помощью API отражения !
public class StackTrace {
public static void main(String args[]) {
StackTrace st = new StackTrace();
st.func();
}
public void func() {
OtherClass os =new OtherClass();
os.getStackTrace(this);
}
}
class OtherClass {
void getStackTrace(Object obj) {
System.out.println(obj.getClass());
}
}