【问题标题】:how to get proper stack trace instead of reflection stack trace?如何获得正确的堆栈跟踪而不是反射堆栈跟踪?
【发布时间】:2011-07-20 13:01:46
【问题描述】:

我有一个大的 red5 项目,似乎在某个时候正在执行一个函数。我试图在我的代码中找到这个特定功能是如何在那时执行的,但我找不到它。我想知道它叫什么。

我通读了stackoverflow中的答案,发现以下显示当前位置的堆栈跟踪信息。

    StackTraceElement[] elements = Thread.currentThread().getStackTrace();
    for (int i=0;i<elements.length;i++) {
        log.error(elements[i].toString());
    }

我收到以下输出:

java.lang.Thread.getStackTrace(Thread.java:1479)
component.lobby.LobbyMysql.getChallenges(LobbyComponentMysql.java:76)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.apache.commons.beanutils.BeanMap.get(BeanMap.java:390)
org.red5.io.amf.Output.writeObject(Output.java:357)
org.red5.io.object.Serializer.writeObjectType(Serializer.java:300)
org.red5.io.object.Serializer.writeComplex(Serializer.java:140)
org.red5.io.object.Serializer.serialize(Serializer.java:86)
org.red5.io.amf.Output.writeObject(Output.java:357)
org.red5.io.object.Serializer.writeObjectType(Serializer.java:300)
org.red5.io.object.Serializer.writeComplex(Serializer.java:140)
org.red5.io.object.Serializer.serialize(Serializer.java:86)
...

我确实得到了正在执行的函数的名称,但出于某种原因,顶层是反射类。有没有办法找出调用这个特定函数的实际方法?

我不是 Java 和反射,所以请多多包涵 :)

谢谢

【问题讨论】:

  • 要回答它为什么调用该方法,我相信它正在尝试序列化对象,因此正在调用您类中的所有 getter 以获取当前状态。它使用反射来做到这一点。

标签: java reflection stack-trace


【解决方案1】:

显然,“实际”代码使用反射的,所以这就是您将在堆栈跟踪中看到的内容。

如果您可以在调试模式下运行代码,请使用断点而不是打印堆栈跟踪。当断点被命中时,查看挂起线程的调用堆栈中发生了什么,特别是在这个级别附近:

java.lang.reflect.Method.invoke(Method.java:597)

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2011-02-19
    • 1970-01-01
    • 2012-03-02
    • 1970-01-01
    • 2011-05-25
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多