第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何獲取Java中的調(diào)用方類

如何獲取Java中的調(diào)用方類

桃花長(zhǎng)相依 2019-10-28 11:04:27
我想獲取方法的調(diào)用者類,即class foo{  bar();}在方法欄中,我需要獲取類名稱foo,然后找到了該方法:Class clazz = sun.reflect.Reflection.getCallerClass(1);但是,即使getCallerClass是public,當(dāng)我嘗試調(diào)用它時(shí),Eclipse 也會(huì)說:訪問限制:由于必需的庫(kù)C:\ Program Files \ Java \ jre7 \ lib \ rt.jar的限制,無法訪問類型為Reflection的方法getCallerClass()還有其他選擇嗎?
查看完整描述

3 回答

?
慕桂英4014372

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è)更好的解決方案。


查看完整回答
反對(duì) 回復(fù) 2019-10-28
?
素胚勾勒不出你

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()));


查看完整回答
反對(duì) 回復(fù) 2019-10-28
  • 3 回答
  • 0 關(guān)注
  • 847 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)