java - 没有显式调用的方法的 Java 堆栈帧(调用站点)
问题描述
我有一个关于 Java 程序执行时出现在堆栈上的方法的问题。我已经对代码进行了检测,以记录方法执行何时开始,以及方法何时退出(考虑之前和之后的 AOP)。我为每个线程创建一个日志。结果大多与预期一致,但有一些细微差别。
- 当遇到反射调用时,不仅
java.lang.reflect.Method#invoke
会记录下来,还会记录其他调用,例如sun.reflect.DelegatingMethodAccessorImpl#invoke
显示。我认为这与StackWalker文档中讨论的隐藏帧有关。 - 还有其他调用,主要是
java.lang.ClassLoader.loadClass
,但也有sun.instrument.InstrumentationImpl.transform
(请记住,我检测代码!)。这些是具有堆栈帧的方法,但应用程序类中没有调用站点。
我有两个问题:
- 是否有所有方法的列表,或定义将隐藏调用的方法的标准(例如“在以 开头的包中的类中定义的所有方法
sun.
)? - 是否有所有方法的列表,或定义由 JVM 调用的方法的标准,而用户代码中没有调用站点?
谢谢
解决方案
sun.reflect.DelegatingMethodAccessorImpl#invoke
和朋友没什么特别的。这些是在 Java 代码中具有常规调用站点的普通 Java 方法。确实,某些 Java 方法是直接从 VM 代码调用的。这样的电话有很多,要得到完整的名单并不容易。
在 HotSpot 源代码中查找
JavaCalls::call_virtual
、JavaCalls::call_static
等。JavaCalls::call_special
例如,这里是对提到的ClassLoader.loadClass
.实际上,任何方法都可以通过这种方式调用。即使您设法获得完整列表,它也不会很有用,因为它可能会在任何次要的 JDK 更新中发生变化。
此外,用户代码和代理库还可以使用 JNI 调用任何 Java 方法,并且这些调用也不会有可见的 Java 调用站点。
推荐阅读
- python - 第一个 Jinja 没有运行
- c# - WebClient DownloadString() 的几个异常
- python - 如何在 tweepy 的 search_users 中使用搜索过滤器?
- java - Sbt 无法在 Visual Studio 代码上运行
- c# - 我无法在 SQL Server 上将 Devart 与 Entity Framework Core 一起使用
- jmeter - 即使在通过 JMeter 启动应用程序时页面内容未加载,是否可以运行导入的脚本?
- ruby-on-rails - Ruby on rails 将行提取到 pdf 并转换
- asp.net - Blazor webassembly pwa 会话存储在部署到 Azure 后不持久
- css - 根据 Spartacus 中的页面槽更改 PageTemplate 样式
- c - 如果它是字符串,如何在主函数中修改/使用命令行参数?