在 IDE(如 Eclipse/IntelliJ)中編寫 Servlet 或普通 Java 類時,方法參數明明命名為 request, response 或 req, res,但通過反射獲取參數名、查看編譯後的 .class 文件(用 javap -v)或生成的 Javadoc 時,卻顯示為 arg0, arg1。
Java 編譯器默認不將方法參數名寫入字節碼。參數名屬於「源碼級」信息,僅用於開發時可讀性。編譯為 .class 文件時,為了減小體積,默認丟棄局部變量表中的參數名,只保留類型和槽位索引。反射 API Method.getParameters() 在無調試信息時返回合成名稱 argN。
-parameters 參數(Java 8+)。javac -parameters MyClass.javamaven-compiler-plugin 配置 <parameters>true</parameters>。<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<parameters>true</parameters>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>tasks.withType(JavaCompile) { options.compilerArgs << "-parameters" }-parametersimport java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class Test {
public void doGet(HttpServletRequest request, HttpServletResponse response) {}
public static void main(String[] args) throws Exception {
Method m = Test.class.getMethod("doGet", HttpServletRequest.class, HttpServletResponse.class);
for (Parameter p : m.getParameters()) {
System.out.println(p.getName()); // 輸出 request, response 而非 arg0, arg1
}
}
}
開啟 -parameters 會略微增加 .class 文件體積(每個方法參數約幾十字節),對運行時性能無影響,現代構建工具均建議默認開啟。