3 回答

TA貢獻1871條經驗 獲得超13個贊
您可以生成堆棧跟蹤并使用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;
}
}
如果你調用KDebug.getCallerClassName()從bar(),你會得到"foo"。
現(xiàn)在假設您想知道方法調用的類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;
}
那是用于調試嗎?如果沒有,可能有一個更好的解決方案。

TA貢獻1827條經驗 獲得超9個贊
堆棧跟蹤
這高度取決于您要查找的內容...但是,這應該直接在此對象中獲得調用此方法的類和方法。
索引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。您需要嘗試抓住。
同樣,如果您希望忽略類本身內的調用,則必須添加一些帶有邏輯的循環(huán)來檢查該特定事物。
像...(我沒有測試過這段代碼,所以要當心)
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();
StackWalker
StackWalker StackFrame
請注意,這不是詳盡的指南,而是這種可能性的一個示例。
打印每個StackFrame的Class(通過獲取Class引用)
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
做同樣的事情,但首先將流收集到一個列表中。僅用于演示目的。
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.walk(stream -> stream.collect(Collectors.toList()))
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
添加回答
舉報