Zachowanie nazw parametrów/argumentów w skompilowanych klasach java

Kiedy kompiluję coś takiego:

public class MyClass
{
    void myMethod(String name, String options, String query, String comment)
    {
        ...
    }
}

I skompilować to do pliku klasy, wydaje się, że nazwy argumentów są utracone. Oznacza to, że gdy jakiś inny kod Javy odwołuje się do MyClass i chce wywołać lub nadpisać myMethod, Mój IDE (obecnie Eclipse) wydaje się pobierać sygnaturę tej metody z pliku klasy:

void myMethod(String arg0, String arg1, String arg2, String arg3);

Wiem, że Eclipse (i ewentualnie inne IDE też) pozwala mi podać link do źródła lub javadoc(Jak zauważył Bishiboosh) z MyClass i może zaleta tego. Ale jestem ciekaw, czy jest jakiś sposób, aby powiedzieć javac, aby włączyć nazwy do pliku klasy, tak aby użytkownicy tej klasy mogli zobaczyć nazwy argumentów, nawet jeśli mają tylko plik klasy.

Rozwiązanie dla klas

Kiedy kompiluję klasę z java -g:vars, nazwy parametrów są zawarte w pliku klasy. -g:vars wydaje się być odpowiednikiem Eclipse -> właściwości projektu -> kompilator Javy -> dodawanie atrybutów zmiennych do generowanych plików klas.

To rozwiązanie zostało zasugerowane przez kilku autorów, ale odpowiedź od Nicka w końcu dała mi wiarę.

Na moim komputerze, Eclipse czasami używało tych informacji, czasami nie, co prawdopodobnie było moją winą lub błędem w Eclipse, ale nie było problemu z plikami klas lub kompilacją. W każdym razie, teraz wiem, że informacje są zdecydowanie obecne.

Ale nie ma rozwiązania dla interfejsów

Chociaż to działa (w pewnym sensie) dobrze dla klas, to nie działa dla interfejsów.

Dla mnie, logicznym powodem wydaje się być to, że-g:vars dostarcza tylko nazwy zmiennych lokalnych, co również stwierdza dokumentacja javaca. W ciele metody jej parametry są bardzo podobne do zmiennych lokalnych, dlatego są one objęte przez-g: vars. metody interfejsu nie mają ciał, więc nie mogą mieć lokalnych zmiennych.

Moje pierwsze pytanie zadałem tylko na zajęcia, ponieważ nie byłem świadomy, że może być jakaś różnica.

Class file format

Jako GID wskazał, że format pliku klasy nie obsługuje przechowywania nazw parametrów. Znalazłem sekcję w pliku klasy spec , która descibes struture danych, które powinny zawierać nazwy parametrów metod, ale to na pewno nie jest używane podczas kompilacji interfejsów.

Podczas kompilacji Klasy, Nie wiem czy wspomniana struktura danych jest używana, czy Eclipse wywiera nazwy parametrów z użycia parametrów wewnątrz metody. Ekspert mógłby wyjaśnić to, ale to chyba nie jest istotne.

Author: Idolon, 2009-06-02

6 answers

Aby zachować nazwy w pliku klasy do celów debugowania, spróbuj użyć właściwości projektu, kompilatora Javy, a następnie "dodaj atrybuty zmiennych do wygenerowanych plików klasy" (Zobacz pomoc Eclipse).

Kompilowanie następującego źródła:

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

Jest dekompilowany na:

// 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
}

Zobacz nazwy parametrów są zachowane w plikach klas.

Sugerowałbym, abyś przyjrzał się, jak twoje źródło jest kompilowane, dla której wersji jest kompilowane itd.

EDIT:

Ah, widzę, że jest inaczej w przypadku interfejsów - wydaje się, że nie mają tych informacji dostępnych dla debuggera, co chyba ma sens. Myślę, że nie będzie sposobu na obejście tego, jeśli po prostu chcesz zobaczyć nazwy parametrów podczas edycji źródła, musisz przejść trasę javadoc, jak sugeruje Nagrom_17(załącz źródło).

 8
Author: Pool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 13:45:00

Nie potrzebujesz specjalnie źródła, aby nazwy arg pojawiały się w Eclipse...Jeśli podasz Javadoc, Eclipse wyświetli args.

 6
Author: Valentin Rocher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 12:17:34

Może pomóc skompilować z obsługą debugowania, która przechowuje wszystkie nazwy w .plik klasowy.

Choć Nie wiem czy Eclipse bierze to pod uwagę.

 5
Author: starblue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 12:26:10

W strukturze danych Pliku klasy nie ma wsparcia dla przechowywania nazw parametrów dla żadnej metody, bez względu na to, jakich opcji javac używasz.

Aby zobaczyć oryginalne nazwy w IDE, musisz dostarczyć im javadoc lub źródło.

Jeśli masz konkretną potrzebę, aby uzyskać na nich w czasie wykonywania, można dodać adnotacje do parametrów, ale musisz utworzyć własne, ponieważ nie ma standardowego zestawu do użycia.

Sorry can ' t be more pomocne

EDIT : Jestem całkowicie poprawiony...format pliku klasy ma wyraźnie miejsce na nazwane parametry (JLS 4.7)

Nie widzę, jak do cholery można się do nich dobrać używając java.lang.reflect.*

 2
Author: Gareth Davis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 13:15:38

Eclipse pobierze nazwy argumentów, jeśli umieścisz informacje o debugowaniu w pliku klasy: javac -g:vars powinno wystarczyć.

 1
Author: Aaron Digulla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 12:32:14

Nie potrzebujesz osobnego pliku Javadoc możesz utworzyć' inline ' Javadoc w Eclipse używając specjalnego komentarza z dwiema gwiazdkami (*) po pierwszym ukośniku wielowierszowego komentarza.

Przykładowy kod:

   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)
    {
        ...
    }
}
 0
Author: MESLewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-02 12:32:52