How to get the caller class in Java

This question already has an answer here:

  • How to get the name of the calling class in Java? 9 answers

  • You can generate a stack trace and use the informations in the StackTraceElements.

    For example an utility class can return you the calling class name :

    public class KDebug {
        public static String getCallerClassName() { 
            StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
            for (int i=1; i<stElements.length; i++) {
                StackTraceElement ste = stElements[i];
                if (!ste.getClassName().equals(KDebug.class.getName()) && ste.getClassName().indexOf("java.lang.Thread")!=0) {
                    return ste.getClassName();
                }
            }
            return null;
         }
    }
    

    If you call KDebug.getCallerClassName() from bar() , you'll get "foo" .

    Now supposing you want to know the class of the method calling bar (which is more interesting and maybe what you really wanted). You could use this method :

    public static String getCallerCallerClassName() { 
        StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
        String callerClassName = null;
        for (int i=1; i<stElements.length; i++) {
            StackTraceElement ste = stElements[i];
            if (!ste.getClassName().equals(KDebug.class.getName())&& ste.getClassName().indexOf("java.lang.Thread")!=0) {
                if (callerClassName==null) {
                    callerClassName = ste.getClassName();
                } else if (!callerClassName.equals(ste.getClassName())) {
                    return ste.getClassName();
                }
            }
        }
        return null;
     }
    

    Is that for debugging ? If not, there may be a better solution to your problem.


    要获取调用者/被调用者类名称,请使用下面的代码,它对我来说工作正常。

    String callerClassName = new Exception().getStackTrace()[1].getClassName();
    String calleeClassName = new Exception().getStackTrace()[0].getClassName();
    

    This Highly depends what you are looking for... But this should get the class and method that called this method within this object directly.

  • index 0 = Thread
  • index 1 = this
  • index 2 = direct caller, can be self.
  • index 3 ... n = classes and methods that called each other to get to the index 2 and below.
  • For Class/Method/File name:

    Thread.currentThread().getStackTrace()[2].getClassName();
    Thread.currentThread().getStackTrace()[2].getMethodName();
    Thread.currentThread().getStackTrace()[2].getFileName();
    

    For Class:

    Class.forName(Thread.currentThread().getStackTrace()[2].getClassName())
    

    FYI: Class.forName() throws a ClassNotFoundException which is NOT runtime. Youll need try catch.

    Also, if you are looking to ignore the calls within the class itself, you have to add some looping with logic to check for that particular thing.

    Something like... (I have not tested this piece of code so beware)

    StackTraceElement[] stes = Thread.currentThread().getStackTrace();
    for(int i=2;i<stes.length;i++)
      if(!stes[i].getClassName().equals(this.getClass().getName()))
        return stes[i].getClassName();
    

    Just a thought....

    链接地址: http://www.djcxy.com/p/73802.html

    上一篇: 如何成功播放.mp3文件

    下一篇: 如何获得Java中的调用者类