Fernflower(Intellij中的反编译器)如何通过反射无法获取参数名称?

时间:2018-03-03 07:35:35

标签: java reflection decompiler

在尝试解析函数uisng java reflection API(m.getParameters())的参数时,参数名称始终是隐藏的,而是我们得到的名称如arg0,arg1 ..

但是当通过Intellij中的反编译类时,参数名称清晰可用并与原始源代码匹配。

如果参数名不在字节码中,这怎么可能?

1 个答案:

答案 0 :(得分:1)

根据所使用的编译器选项,可选存储在字节码中的参数名称。

从Java 8开始,您可以将-parameters选项传递给javac以保留名称。如果以这种方式编译,method.getParameters()[0].getName()将为您提供原始名称。

在Java 8之前,可以通过传递-g参数来保留调试符号。但是提取它们是一种痛苦......你需要ASM来解析字节码以提取信息。 Paranamer lib使它变得简单。

您正在反编译的类可能已使用保留的名称进行编译。

要以这种方式编译自己的类,请在编译器下添加-parameters

IntelliJ IDEA中的

Settings | Build, Execution, Deployment | Compiler | Java Compiler | Additional command line parameters

Eclipse中的

或:Window | Preferences | Java | Compiler | Store information about method parameters (usable via reflection)

Maven的编译器插件中还有<parameters>选项。