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ć?
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ą:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
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
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.
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ć:
- jeśli klasa zawiera zmiennąenum , to dla tego też zostanie wygenerowana oddzielna Klasa. Nazwa ... generowana Klasa to ClassName$Nazwa_of_enum .
- 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
- 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.
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.
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