2012-07-10 27 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

相关问题