当我编译这样的东西时:
public class MyClass
{
void myMethod(String name, String options, String query, String comment)
{
...
}
}
并将其编译为类文件,似乎参数名称丢失了。也就是说,当一些其他 Java 代码引用MyClass
并想要调用或覆盖myMethod
时,我的 IDE(当前为 Eclipse)似乎从类文件中获取此方法签名:
void myMethod(String arg0, String arg1, String arg2, String arg3);
我知道 Eclipse(也可能还有其他 IDE)允许我提供指向源代码或 javadoc (正如 Bishboosh 指出的那样)的链接,MyClass
并且可以利用这一点。但是我很好奇是否有某种方法可以告诉javac
将名称包含到类文件中,以便该类的用户即使只有类文件也可以看到参数名称。
班级解决方案
当我用 编译一个类时java -g:vars
,参数的名称包含在类文件中。-g:vars
似乎相当于 Eclipse -> 项目属性 -> Java 编译器 -> 将变量属性添加到生成的类文件中。
这个解决方案是由几位作者提出的,但尼克的回答最终让我相信了。
在我的机器上,Eclipse 有时使用此信息,有时没有,这可能是我的错或 Eclipse 中的错误,但不是类文件或编译的问题。无论如何,现在我知道信息肯定存在。
但是没有接口的解决方案
虽然这适用于类(有点)好,但它不适用于接口。
对我来说,合乎逻辑的原因似乎是, -g:vars 只提供局部变量的名称,这也是 javac 的文档所指出的。在方法体中,它的参数与局部变量非常相似,因此它们被 -g:vars 覆盖。接口方法没有主体,所以它们不能有局部变量。
我最初的问题只要求上课,因为我不知道可能会有任何区别。
类文件格式
正如gid所指出的,类文件格式不支持存储参数名称。我在类文件规范中找到了一个部分,它描述了一个数据结构,它应该包含方法的参数名称,但这在编译接口时绝对不会使用。
在编译一个类时,我无法判断是否使用了提到的数据结构,或者 Eclipse 是否从方法体内参数的使用情况推断出参数名称。专家可以澄清这一点,但我认为这并不重要。