获取有关调用类的信息

时间:2010-02-19 12:41:38

标签: java reflection

是否可以获取有关调用另一个类的类的信息?


class Bar{
    public Bar{}

    public String getInvokingClassInfo(){
        return "...";
    }
}

class Foo{
    public Foo(){
       Bar bar = new Bar();
       System.out.println("Invoking class is: "+bar.getInvokingClassInfo());
    }
}

如何到达这个地方:


System.out.println(bar.getInvokingClassInfo());

关于调用(Foo)这个(Bar)的类的信息:

Invoking class: Foo

4 个答案:

答案 0 :(得分:8)

 StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
 String callerClassName = stackTrace[index].getClassName();

这是获取当前线程的堆栈跟踪。正如评论中所指出的那样,存在实现上的差异,所以如果你担心这样,你可以实现类似的东西:

  • 循环遍历StackTraceElement数组(使用在循环外声明的计数器变量)
  • 每当遇到当前的班级名称和当前方法时,break
  • 获取数组的 next 元素 - 它将是调用者。 (这是上面代码中index代表的内容)
  • 如果上述内容未提供相关信息,您可以随时返回new Exception().getStackTrace()

答案 1 :(得分:3)

我能想到的最好的(虽然是扭曲的和丑陋的)解决方案是在Bar内抛出异常并立即捕获它,然后从堆栈跟踪中提取调用者信息。

根据其他人的评论进行更新:您甚至不需要抛出并捕获异常,new Exception().getStackTrace()就可以了。

答案 2 :(得分:2)

我能想象的最强大的方法是将“this”作为参数从A内部传递给B.然后B可以查看该对象,并打印出它的类。

所有摆弄堆栈痕迹的东西都依赖于无法保证工作的东西。 “通过 - 这种”方法将会。

答案 3 :(得分:0)

我找到的最简单的方法是创建以下类:

private static class ClassLocator extends SecurityManager {
    public static Class<?> getCallerClass() {       
        return new ClassLocator().getClassContext()[2];
    }
}

正如API Reference所说:

“protected Class [] getClassContext() 将当前执行堆栈作为类数组返回。 数组的长度是执行堆栈上的方法数。索引0处的元素是当前正在执行的方法的类,索引1处的元素是该方法的调用者的类,依此类推。“

http://docs.oracle.com/javase/7/docs/api/java/lang/SecurityManager.html#getClassContext()