是否可以获取有关调用另一个类的类的信息?
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
答案 0 :(得分:8)
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
String callerClassName = stackTrace[index].getClassName();
这是获取当前线程的堆栈跟踪。正如评论中所指出的那样,存在实现上的差异,所以如果你担心这样,你可以实现类似的东西:
StackTraceElement
数组(使用在循环外声明的计数器变量)break
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()