如何获得Java中的调用者类
这个问题在这里已经有了答案:
您可以生成堆栈跟踪并使用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取决于你在找什么......但是这应该得到直接在这个对象中调用这个方法的类和方法。
对于类/方法/文件名:
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