私がこのようなものをコンパイルするとき:
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も)を使用すると、(Bishibooshが指摘したように)ソースまたはjavadocへのリンクを提供でき、これを利用できることを知ってMyClass
います。javac
しかし、クラスファイルに名前を含めるように指示して、そのクラスのユーザーがクラスファイルしかない場合でも引数名を表示できるようにする方法があるかどうか、興味があります。
クラスのソリューション
を使用してクラスをコンパイルするとjava -g:vars
、パラメーターの名前がクラスファイルに含まれます。-g:vars
Eclipse->プロジェクトプロパティ->Javaコンパイラ->生成されたクラスファイルに変数属性を追加することと同等のようです。
この解決策は何人かの著者によって提案されましたが、ニックからの答えはついに私を信じさせました。
私のマシンでは、Eclipseがこの情報を使用することもあれば、使用しないこともありました。これはおそらく私のせいであるかEclipseのバグでしたが、クラスファイルやコンパイルの問題ではありませんでした。とにかく、今私は情報が間違いなく存在することを知っています。
しかし、インターフェースの解決策はありません
これはクラスでは(一種の)問題なく機能しますが、インターフェイスでは機能しません。
私にとって、論理的な理由は、-g:varsがローカル変数の名前のみを提供することであるように思われます。これは、javacのドキュメントにも記載されています。メソッドの本体では、そのパラメーターはローカル変数に非常に似ているため、-g:varsでカバーされます。インターフェイスメソッドには本体がないため、ローカル変数を使用できません。
私の最初の質問はクラスだけを求めていました。違いがあるかもしれないとは知らなかったからです。
クラスファイル形式
gidが指摘したように、クラスファイル形式はパラメータ名の格納をサポートしていません。クラスファイルの仕様で、メソッドのパラメーター名をホフするデータ構造を説明するセクションを見つけましたが、これはインターフェイスのコンパイル時には絶対に使用されません。
クラスをコンパイルするとき、上記のデータ構造が使用されているかどうか、またはEclipseがメソッド本体内のパラメーターの使用法からパラメーター名を推測するかどうかがわかりません。専門家はこれを明確にすることができますが、それは私が思うほど適切ではありません。