質問

次のようなものをコンパイルすると:

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 へのリンクを提供できることは知っています。 (ビシブーシュが指摘したように)MyClass そしてこれを活用することができます。でも、何か見分ける方法があるのか​​気になります javac 名前をクラス ファイルに含めることで、そのクラスのユーザーがクラス ファイルしか持っていない場合でも引数の名前を確認できるようになります。

授業向けソリューション

クラスをコンパイルすると java -g:vars, 、パラメータの名前はクラスファイルに含まれています。 -g:vars Eclipse -> プロジェクトプロパティ -> Java コンパイラ -> 生成されたクラスファイルに変数属性を追加するのと同等のようです。

この解決策は何人かの著者によって提案されていましたが、Nick からの答えで私は最終的に信じることができました。

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

しかしインターフェースに関しては解決策がない

これはクラスでは(ある意味)うまく機能しますが、インターフェイスでは機能しません。

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

私の最初の質問はクラスについてのみでした。なぜなら、違いがあるかどうか知らなかったからです。

クラスファイル形式

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

クラスをコンパイルするときに、前述のデータ構造が使用されているのか、それとも Eclipse がメソッド本体内のパラメーターの使用法からパラメーター名を推測しているのかがわかりません。専門家ならこれを明確にしてくれるかもしれませんが、私はそれはあまり意味がないと思います。

役に立ちましたか?

解決

デバッグ目的でクラス ファイルに名前を保存するには、プロジェクト プロパティ、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 ルートに進む必要があります (ソースを添付)。

他のヒント

あなたは特別な引数名を使用すると、Javadocを指定すると、Eclipseは引数が表示されます... Eclipseで表示させるために、ソースを必要としません。

これはの.classファイル内のすべての名前を格納し、デバッグのサポート、使用してコンパイルするのに役立つかもしれません。

私は、Eclipseは、アカウントにそれを取るかどうかわかりませんけれどもます。

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

あなたがjavadocのか、ソースのいずれかでそれらを提供する必要がIDEで元の名前を見るために。

あなたは、実行時にそれらを取得するために特に必要がある場合は、

パラメータに注釈を追加することは可能ですが、使用するように設定された標準がないとして、独自に作成する必要があります。

申し訳ありませんが、より役に立つことはできません。

編集: 私は完全に補正スタンド...クラスファイル形式は明らかに(名前付きパラメータのためのスペースを持っていない<のhref = "http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html# 43817" REL = "nofollowをnoreferrer"> JLS 4.7 の)

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

あなたはクラスファイルにデバッグ情報が含まれる場合は、

Eclipseは、引数の名前をピックアップします:javac -g:varsは十分なはずです。

あなたは複数行コメントの最初のスラッシュの後の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)
    {
        ...
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top