在尝试解析函数uisng java reflection API(m.getParameters()
)的参数时,参数名称始终是隐藏的,而是我们得到的名称如arg0,arg1 ..
但是当通过Intellij中的反编译类时,参数名称清晰可用并与原始源代码匹配。
如果参数名不在字节码中,这怎么可能?
答案 0 :(得分:1)
根据所使用的编译器选项,可选存储在字节码中的参数名称。
从Java 8开始,您可以将-parameters
选项传递给javac以保留名称。如果以这种方式编译,method.getParameters()[0].getName()
将为您提供原始名称。
在Java 8之前,可以通过传递-g
参数来保留调试符号。但是提取它们是一种痛苦......你需要ASM来解析字节码以提取信息。 Paranamer lib使它变得简单。
您正在反编译的类可能已使用保留的名称进行编译。
要以这种方式编译自己的类,请在编译器下添加-parameters
:
Settings | Build, Execution, Deployment | Compiler | Java Compiler | Additional command line parameters
或:Window | Preferences | Java | Compiler | Store information about method parameters (usable via reflection)
。
Maven的编译器插件中还有<parameters>
选项。