【发布时间】:2013-06-28 14:55:39
【问题描述】:
最近有人告诉我,如果您查看 Java 程序的调试信息,您可以获得比反射更多的信息。我意识到虽然我真的不知道什么,也许除了内存位置等。那么通过反射无法获得的调试信息还能得到什么(注意:我不是在谈论使用断点来获取实际的运行时值)?是否有任何信息可以通过反射获得而您无法从调试器中获得?
【问题讨论】:
标签: java debugging reflection
最近有人告诉我,如果您查看 Java 程序的调试信息,您可以获得比反射更多的信息。我意识到虽然我真的不知道什么,也许除了内存位置等。那么通过反射无法获得的调试信息还能得到什么(注意:我不是在谈论使用断点来获取实际的运行时值)?是否有任何信息可以通过反射获得而您无法从调试器中获得?
【问题讨论】:
标签: java debugging reflection
我假设“使用调试器信息”实际上是指“使用agent API”,这是调试器(以及其他)使用的。
答案很多。
for 启动 JVMTI 可以force garbage collection,这是纯 Java API 无法做到的。 对于特定类型的应用程序,这与常识相反,有时甚至对于“生产”代码也很有用。
您还可以在加载类时对其进行检测。这对于各种分析器工具、编译代码的混淆(加密的类文件)甚至动态更改加载的类以响应源代码的更改(见jrebel 一个很好的例子)很有用
【讨论】:
jdwp 代理使用 API(我相信这是大多数调试工具所做的)。