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());
    }
}