Java: how to get arguments passed to method that called this method?

后端 未结 6 1457
慢半拍i
慢半拍i 2020-11-28 14:25

In java, it is possible to get the class and method that called the current method (the method in which you get the StackTrace).

My question is, can I get the argume

相关标签:
6条回答
  • 2020-11-28 14:50

    I'm not sure why you'd ever want to do this in Java?

    The only way I can think of is to create a custom wrapper object for the passed string, thus sending the reference to the wrapper instead of a new string each time.
    I'd advice against it, though, since it clutters your original code, and makes it even more error prone.

    Might this problem not be solved using a debugger, like the one built into eclipse, to inspect your state?

    0 讨论(0)
  • You can get name of caller method and its class, but you have to add some code in current method:

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

    This will print "call" and "main", methods name in called order (reverse).

    0 讨论(0)
  • 2020-11-28 15:05

    In my case, I needed to get a parameter value has been passed to a method in a certain stack frame to be used later within the execution flow

    I used ThreadLocal to store it and when I needed it I was able to retrieve it at any point in code as I declared it as public static

    here is a skeleton example

    public static final ThreadLocal<SomeType> IMPORTANT_THREAD_LOCAL_FOR_BLA = ThreadLocal.withInitial(whatever);
    
    methodWithImportantParam(SomeType importantValue){
        // save it in the static threadLocal Field
        this.IMPORTANT_THREAD_LOCAL_FOR_BLA.get()=importantValue;// code to set the value
        // continue method logic
    }
    

    and somewhere in code where you need that value

    YourClass.IMPORTANT_THREAD_LOCAL_FOR_BLA.get()
    

    but make sure the execution flow that you set the value then you retrieve it

    hope my answer add something valuable to this question

    0 讨论(0)
  • 2020-11-28 15:09

    I think this could be possible, because input is out of scope but isn't yet accessible for garbage collection, so the value still exists, but unfortunately I don't believe there is an default API way to access it. This could be maybe possible with a custom implemented NDC (nested diagnostic context) for the logging approach.

    0 讨论(0)
  • 2020-11-28 15:09

    This is possible using Reflection 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());
        }
    }
    
    0 讨论(0)
  • 2020-11-28 15:10

    I don't believe this is possible using the standard Java API.

    What you could do is to use AspectJ, place a point-cut at the calling method, save the arguments, place a point-cut at the called method and pass on the arguments.

    Another option (slightly more advanced) is to use a custom, bytecode-rewriting, class loader that saves the original arguments, and passes them on as extra arguments to the next method. This would probably take a day or two to implement. Suitable frameworks are BCEL or ASM.

    0 讨论(0)
提交回复
热议问题