我是一名硕士生,正在研究静态分析。在我的一项测试中,我遇到了在 java 编译器中标记行的问题。
我有以下java代码:
226: String json = "/org/elasticsearch/index/analysis/commongrams/commongrams_query_mode.json";
227: Settings settings = Settings.settingsBuilder()
228: .loadFromStream(json, getClass().getResourceAsStream(json))
229: .put("path.home", createHome())
230: .build();
Run Code Online (Sandbox Code Playgroud)
编译此代码并执行命令时javap -p -v CLASSNAME,我得到一个表,其中包含字节码中每条指令的源代码的相应行。
见下图:
问题在于,在对该.put (" path.home ", createHome ())方法的调用中,字节码基本上生成四个指令:
19: anewarray
24: ldc - String path.home
30: invokespecial - createHome
34: invokevirtual - put
Run Code Online (Sandbox Code Playgroud)
前两行标记为第 228 行(错误),后两行标记为第 229 行(正确)。
见下图:
这是该方法的原始实现.put("path.home", createHome()):
public Builder put(Object... settings) {
if (settings.length == 1) {
// support cases where the actual …Run Code Online (Sandbox Code Playgroud)