3 回答

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超13個(gè)贊
您可以生成堆棧跟蹤并使用StackTraceElements中的信息。
例如,實(shí)用程序類可以為您返回調(diào)用類名稱:
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;
}
}
如果你調(diào)用KDebug.getCallerClassName()從bar(),你會(huì)得到"foo"。
現(xiàn)在假設(shè)您想知道方法調(diào)用的類bar(這會(huì)更有趣,也許您真正想要的是)。您可以使用以下方法:
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;
}
那是用于調(diào)試嗎?如果沒有,可能有一個(gè)更好的解決方案。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
堆棧跟蹤
這高度取決于您要查找的內(nèi)容...但是,這應(yīng)該直接在此對(duì)象中獲得調(diào)用此方法的類和方法。
索引0 =線程
索引1 =這個(gè)
索引2 =直接呼叫者,可以是自己。
索引3 ... n =相互調(diào)用以獲得索引2及以下的類和方法。
對(duì)于類/方法/文件名:
Thread.currentThread().getStackTrace()[2].getClassName();
Thread.currentThread().getStackTrace()[2].getMethodName();
Thread.currentThread().getStackTrace()[2].getFileName();
上課:
Class.forName(Thread.currentThread().getStackTrace()[2].getClassName())
僅供參考:Class.forName()拋出不是運(yùn)行時(shí)的ClassNotFoundException。您需要嘗試抓住。
同樣,如果您希望忽略類本身內(nèi)的調(diào)用,則必須添加一些帶有邏輯的循環(huán)來檢查該特定事物。
像...(我沒有測(cè)試過這段代碼,所以要當(dāng)心)
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
請(qǐng)注意,這不是詳盡的指南,而是這種可能性的一個(gè)示例。
打印每個(gè)StackFrame的Class(通過獲取Class引用)
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
做同樣的事情,但首先將流收集到一個(gè)列表中。僅用于演示目的。
StackWalker.getInstance(Option.RETAIN_CLASS_REFERENCE)
.walk(stream -> stream.collect(Collectors.toList()))
.forEach(frame -> System.out.println(frame.getDeclaringClass()));
添加回答
舉報(bào)