skompilowane klasy Javy zawierają znaki dolara

Używam Eclipse jako swojego IDE rozwoju. Używam go również do eksportowania mojej aplikacji do .plik jar. Kiedy patrzę na moje zajęcia w ... plik jar, kilka moich klas zawiera nazwę tej klasy, znak dolara, a następnie numer. Przykład:

  • Znajdź$1.klasa
  • Znajdź$2.klasa
  • Znajdź $ 3.klasa Znajdź.klasa

Zauważyłem, że robi to na większych zajęciach. Czy to dlatego, że klasy stają się tak duże, że kompiluje je do wielu klas? Wygooglowałem i spojrzał na wielu forach, i przeszukać dokumentację Java, ale nie znaleziono nic nawet związane z nim. Czy ktoś może to wyjaśnić?

Author: Óscar López, 2012-07-09

4 answers

Klasy wewnętrzne, jeśli są obecne w twojej klasie, zostaną skompilowane, a plik klasy będzie ClassName$InnerClassName. W przypadku anonimowych klas wewnętrznych, będą one wyświetlane jako liczby. Rozmiar klasy (kod Java) nie prowadzi do generowania wielu klas.

Np. podany fragment kodu:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

Klasy, które zostaną wygenerowane będą:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Aktualizacja:

Używanie anonimowych klas nie jest uważane za złą praktykę , to zależy tylko od użycia.

Sprawdź to dyskusja na temat SO

 86
Author: mprabhat,
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
2017-11-28 06:59:23

To dlatego, że masz anonimowe klasy w tej większej klasie. Są kompilowane przy użyciu tej konwencji nazewnictwa.

Zobacz The Anonymous Class Conundrum

 13
Author: jjathman,
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
2017-05-23 12:10:30

Poza powyższymi przypadkami przedstawionymi przez @mprabhat, innymi przypadkami mogą być:

  1. jeśli klasa zawiera zmiennąenum , to dla tego też zostanie wygenerowana oddzielna Klasa. Nazwa ... generowana Klasa to ClassName$Nazwa_of_enum .
  2. Jeśli twoja klasa X dziedziczy, tzn. rozszerza inną klasę Y , wtedy będzie a .Klasa wygenerowana o nazwie ClassName$1.class lub ClassName$1$1.class
  3. Jeśli twoja klasa X implementuje interfejs Y , wtedy będzieKlasa wygenerowana o nazwie ClassName$1.class lub ClassName$1$1.Klasa .

Te sprawy są pochodnymi mojej kontroli na .pliki klas w jar.

 6
Author: Hoysala,
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
2015-08-28 15:29:05

Aby odpowiedzieć na twój komentarz o są anonimowe klasy złe. Zdecydowanie nie. Rozważ to, aby przypisać słuchacz akcji do Jbuttona:

JButton button = new JButton(...);
button.addActionListener(new ActionListener() { ... });

Lub aby sortować wielkość liter według właściwości "name"

Collections.sort( array, new Comparator<Foo>() {
    public int compare(Foo f1, Foo f2) {
        return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
    }
});

Zobaczysz również wiele klas, które można uruchomić i wywołać jako anonimowe.

 0
Author: Matt,
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
2012-07-11 01:16:20