17

私がこのようなものをコンパイルするとき:

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:varsEclipse->プロジェクトプロパティ->Javaコンパイラ->生成されたクラスファイルに変数属性を追加することと同等のようです。

この解決策は何人かの著者によって提案されましたが、ニックからの答えはついに私を信じさせました。

私のマシンでは、Eclipseがこの情報を使用することもあれば、使用しないこともありました。これはおそらく私のせいであるかEclipseのバグでしたが、クラスファイルやコンパイルの問題ではありませんでした。とにかく、今私は情報が間違いなく存在することを知っています。

しかし、インターフェースの解決策はありません

これはクラスでは(一種の)問題なく機能しますが、インターフェイスでは機能しません。

私にとって、論理的な理由は、-g:varsがローカル変数の名前のみを提供することであるように思われます。これは、javacのドキュメントにも記載されています。メソッドの本体では、そのパラメーターはローカル変数に非常に似ているため、-g:varsでカバーされます。インターフェイスメソッドには本体がないため、ローカル変数を使用できません。

私の最初の質問はクラスだけを求めていました。違いがあるかもしれないとは知らなかったからです。

クラスファイル形式

gidが指摘したように、クラスファイル形式はパラメータ名の格納をサポートしていません。クラスファイルの仕様で、メソッドのパラメーター名をホフするデータ構造を説明するセクションを見つけましたが、これはインターフェイスのコンパイル時には絶対に使用されません。

クラスをコンパイルするとき、上記のデータ構造が使用されているかどうか、またはEclipseがメソッド本体内のパラメーターの使用法からパラメーター名を推測するかどうかがわかりません。専門家はこれを明確にすることができますが、それは私が思うほど適切ではありません。

4

6 に答える 6

8

デバッグ目的でクラスファイルに名前を保持するには、プロジェクトプロパティ、Javaコンパイラ、「生成されたクラスファイルへの変数属性の追加」を試してください(Eclipseヘルプを参照)。

次のソースをコンパイルします。

public class StackOverflowTest {
    public void test(String foo, String bar) {
        // blah
    }
}

逆コンパイルされます:

// Compiled from StackOverflowTest.java (version 1.5 : 49.0, super bit)
public class StackOverflowTest {

    // Method descriptor #6 ()V
    // Stack: 1, Locals: 1
    public StackOverflowTest();
        0  aload_0 [this]
        1  invokespecial java.lang.Object() [8]
        4  return
        Line numbers:
            [pc: 0, line: 1]
        Local variable table:
            [pc: 0, pc: 5] local: this index: 0 type: StackOverflowTest

    // Method descriptor #15 (Ljava/lang/String;Ljava/lang/String;)V
    // Stack: 0, Locals: 3
    public void test(java.lang.String foo, java.lang.String bar);
        0  return
        Line numbers:
            [pc: 0, line: 4]
        Local variable table:
            [pc: 0, pc: 1] local: this index: 0 type: StackOverflowTest
            [pc: 0, pc: 1] local: foo index: 1 type: java.lang.String
            [pc: 0, pc: 1] local: bar index: 2 type: java.lang.String
}

パラメータ名がクラスファイルに保存されていることを確認してください。

ソースがどのようにコンパイルされているか、どのバージョン用にコンパイルされているかなどを調べることをお勧めします。

編集:

ああ、これはインターフェースでは異なるようです。デバッガーでこの情報を利用できるようになっていないようですが、これは理にかなっていると思います。ソースを編集しているときにパラメータ名を確認したいだけの場合は、Nagrom_17が提案するようにjavadocルートに移動する必要があります(ソースを添付してください)。

于 2009-06-02T13:17:04.067 に答える
7

Eclipseに引数名を表示するためにソースは特に必要ありません...Javadocを指定すると、Eclipseは引数を表示します。

于 2009-06-02T12:17:34.607 に答える
5

すべての名前を.classファイルに保存するデバッグサポートを使用してコンパイルすると役立つ場合があります。

Eclipseがそれを考慮に入れているかどうかはわかりませんが。

于 2009-06-02T12:26:10.080 に答える
2

使用するjavacオプションに関係なく、任意のメソッドにパラメーター名を格納するためのクラスファイルデータ構造はサポートされていません。

IDEで元の名前を表示するには、javadocまたはソースのいずれかを指定する必要があります。

実行時にそれらを取得する必要がある場合は、パラメーターに注釈を追加することができますが、使用する標準セットがないため、独自に作成する必要があります。

申し訳ありませんがこれ以上役に立ちません

編集:私は完全に修正されています...クラスファイル形式には、名前付きパラメータ用のスペースが明らかにあります(JLS 4.7

私が見ることができないのは、あなたがそれらを使ってどのように地獄を得ることができるかですjava.lang.reflect.*

于 2009-06-02T12:45:33.553 に答える
1

クラスファイルにデバッグ情報を含めると、Eclipseは引数の名前を取得しますjavac -g:vars。これで十分です。

于 2009-06-02T12:32:14.607 に答える
0

複数行コメントの最初のスラッシュの後に2つのアスタリスク(*)が付いた特別なコメントを使用して、Eclipseで「インライン」javadocを作成できる個別のJavadocファイルは必要ありません。

サンプルコード:

   public class MyClass
{
 /**
  * documentation of your method
  * 
  * @param name    a String describing the name
  * @param options used to describe current option
  * @param query
  * @param comment
  * @return void
  */
    void myMethod(String name, String options, String query, String comment)
    {
        ...
    }
}
于 2009-06-02T12:32:52.237 に答える