如何获得Java中的调用者类

这个问题在这里已经有了答案:

  • 如何在Java中获取调用类的名称? 9个答案

  • 您可以生成堆栈跟踪并使用StackTraceElements中的信息。

    例如,一个实用程序类可以返回您的调用类名称:

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

    如果你从bar()调用KDebug.getCallerClassName() ,你会得到"foo"

    现在假设你想知道方法调用bar的类(这更有趣,也许你真正想要的)。 你可以使用这个方法:

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

    这是为了调试吗? 如果没有,可能会有更好的解决方案来解决您的问题。


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

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

    这个Highly取决于你在找什么......但是这应该得到直接在这个对象中调用这个方法的类和方法。

  • 索引0 =线程
  • 索引1 =这个
  • 索引2 =直接来电,可以自己。
  • 索引3 ... n =相互调用以获得索引2和以下的类和方法。
  • 对于类/方法/文件名:

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

    上课:

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

    仅供参考:Class.forName()抛出一个不是运行时的ClassNotFoundException。 你需要尝试抓住。

    另外,如果你想忽略类中的调用,你必须添加一些逻辑循环来检查特定的事情。

    就像...(我没有测试过这段代码,所以要小心)

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

    只是一个想法....

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

    上一篇: How to get the caller class in Java

    下一篇: Why I get this error: The type 'Empty' is not API?