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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取Java中的調用方類

如何獲取Java中的調用方類

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

3 回答

?
慕桂英4014372

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;

 }

那是用于調試嗎?如果沒有,可能有一個更好的解決方案。


查看完整回答
反對 回復 2019-10-28
?
素胚勾勒不出你

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


查看完整回答
反對 回復 2019-10-28
  • 3 回答
  • 0 關注
  • 840 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號