我对执行Java程序时出现在堆栈上的方法有疑问。我已经检测了代码,以便在方法执行开始时和方法退出时记录日志(考虑一下AOP之前和之后的情况)。我为每个线程创建一个日志。结果基本符合预期,但有一些细微的差异。
java.lang.reflect.Method#invoke
,还会显示诸如sun.reflect.DelegatingMethodAccessorImpl#invoke
之类的其他调用。我认为这与StackWalker文档中讨论的隐藏框架有关。 java.lang.ClassLoader.loadClass
,还有sun.instrument.InstrumentationImpl.transform
(请记住,我是在检查代码!)。这些是具有堆栈框架的方法,但是应用程序类中没有调用站点。 我有两个问题:
sun.
开头的包中的类中定义的所有方法)?谢谢
答案 0 :(得分:1)
sun.reflect.DelegatingMethodAccessorImpl#invoke
和朋友没有什么特别的。这些是普通的Java方法,在Java代码中具有常规的call site。
的确,某些Java方法是直接从VM代码中调用的。这样的电话很多,要获得完整的清单并不容易。
在HotSpot源代码中查找JavaCalls::call_virtual
,JavaCalls::call_static
,JavaCalls::call_special
等。例如,here是对提到的ClassLoader.loadClass
的呼叫。
实际上,任何方法都可以用这种方式有效地调用。即使您设法获得完整列表,它也不会很有用,因为在任何较小的JDK更新中它都可能会更改。
此外,用户代码和代理库也可以使用JNI调用任何Java方法,并且这些调用也不会具有可见的Java调用站点。