【问题标题】:What can I get with debugger information that I cant get with reflection?使用反射无法获得的调试器信息我能得到什么?
【发布时间】:2013-06-28 14:55:39
【问题描述】:

最近有人告诉我,如果您查看 Java 程序的调试信息,您可以获得比反射更多的信息。我意识到虽然我真的不知道什么,也许除了内存位置等。那么通过反射无法获得的调试信息还能得到什么(注意:我不是在谈论使用断点来获取实际的运行时值)?是否有任何信息可以通过反射获得而您无法从调试器中获得?

【问题讨论】:

    标签: java debugging reflection


    【解决方案1】:

    我假设“使用调试器信息”实际上是指“使用agent API”,这是调试器(以及其他)使用的。

    答案很多。

    for 启动 JVMTI 可以force garbage collection,这是纯 Java API 无法做到的。 对于特定类型的应用程序,这与常识相反,有时甚至对于“生产”代码也很有用。

    您还可以在加载类时对其进行检测。这对于各种分析器工具、编译代码的混淆(加密的类文件)甚至动态更改加载的类以响应源代码的更改(见jrebel 一个很好的例子)很有用

    【讨论】:

    • 更不用说您的代理是在 C 而不是 Java 中运行的,因此您可以对进程进行任何您想要的更改,因为没有内存安全限制。不过,可通过 API 获得的另一件事是访问其他更高级别堆栈帧中的变量以及有关堆栈帧本身的元数据。如果您也喜欢在单独的 Java 进程中编写代码,您可以通过 jdwp 代理使用 API(我相信这是大多数调试工具所做的)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多