我有一个关于Java程序执行时出现在堆栈上的方法的问题。我已经检测了代码,以便在方法执行开始时以及方法何时退出时记录(在前后考虑AOP)。我为每个线程创建一个日志。结果大多与预期一致,但有一些微妙的差异。
java.lang.reflect.Method#invoke
,还会显示sun.reflect.DelegatingMethodAccessorImpl#invoke
等其他调用。我假设这与StackWalker文档中讨论的隐藏框架有关。java.lang.ClassLoader.loadClass
,还有sun.instrument.InstrumentationImpl.transform
(请记住,我检测代码!)。这些是具有堆栈帧的方法,但应用程序类中没有调用站点。我有两个问题:
sun.
开头的包中的类中定义的所有方法)?谢谢
sun.reflect.DelegatingMethodAccessorImpl#invoke
和朋友没有什么特别之处。这些是在Java代码中具有常规call site的普通Java方法。JavaCalls::call_virtual
,JavaCalls::call_static
,JavaCalls::call_special
等。例如,here是对上述ClassLoader.loadClass
的调用。
实际上,任何方法都可以通过这种方式进行强制调用。即使您设法获得完整列表,它也不会非常有用,因为它可能会在任何次要的JDK更新中发生变化。
此外,用户代码和代理库也可以使用JNI调用任何Java方法,并且这些调用也不具有可见的Java调用站点。