2012-07-10 29 views
1

我有一個類:如何檢查Java類是否是當前堆棧跟蹤的一部分?

MessageReceiver.java 

接收消息,但也可以間接地產生的消息(即然後可能被重新傳送到這個類)。我不想處理在堆棧跟蹤中使用MessageReceiver.java發送的消息。有沒有一種方法可以有效地確定我收到的消息是否來自MessageReceiver.java?

下鏈是可能的:

MessageReceiver.java -> OtherClass.java -> MessageProducer.java -> MessageReceiver.java 

回答

3

我覺得這是你追求的:

Class<?> myClass = MessageReceiver.class; 
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 

for (StackTraceElement element : stackTrace) { 
    if (element.getClassName().equals(myClass.getCanonicalName())) { 
     System.out.println("class found in stack trace"); 
     break; 
    } 
} 
+0

這可能是一樣好,因爲它..我希望isClassInStack(類)方法 – jsurls 2012-07-10 14:22:39

+0

我也在尋找類似的東西。一個奇怪的是,你不能真正的調用類,只有名字。字符串匹配不太好,但看起來就是這樣做的。 – 2012-07-10 14:28:17

+0

對於Java 9,Stackwalker可能更安全:https://docs.oracle.com/javase/9​​/docs/api/java/lang/StackWalker.html – 2017-11-02 13:42:16

0

你可以得到異常的堆棧跟蹤,只是環比較它們的類名。

Exception.getStackTrace()返回一個StackTraceElements數組,它有一個getClassName方法。

http://docs.oracle.com/javase/6/docs/api/java/lang/Throwable.html#getStackTrace() http://docs.oracle.com/javase/6/docs/api/java/lang/StackTraceElement.html

假設我理解這個問題

+0

我在這看着原本並認爲這可能是我唯一的選擇。我不想遍歷列表只是爲了找到我的類,因爲這可能會非常低效,這取決於跟蹤可能會有多大。 – jsurls 2012-07-10 14:00:05

1

你可以自定義標題添加到指示原始發射的消息。因此MessageReceiver將通過將標頭值設置爲"MessageReceiver"來發送消息,並且將放棄具有該特定標頭值的所有消息。

+0

但是它可能比OtherClass.java多N個類,我可能不知道其他類的存在。基本上,OtherClass.java是可能產生消息的黑洞代碼。 – jsurls 2012-07-10 13:57:21

+0

我不認爲有區別。你想要的是檢測原始發射器是誰。其他潛在的發射器類應首先檢查該標題值,並且只有在以前未由其他類設置時才設置它。 – Mihai 2012-07-10 14:01:48

相關問題