скомпилированные классы java содержат знаки доллара
Я использую Eclipse в качестве среды разработки. Я также использовать это, чтобы экспортировать свою заявку на .файл jar. Когда я смотрю на свои занятия в школе .jar-файл, некоторые из моих классов содержат имя этого класса, знак доллара, а затем номер. Пример:
- найти$1.класс
- найти$2.класс
- найти$3.класс
- найти.класс
Я заметил, что он делает это на больших классах. Это потому, что классы становятся настолько большими, что он компилируется это в несколько классов? Я искал и смотрел на нескольких форумах, и искал документацию Java, но не нашел ничего, даже связанного с ней. Может кто-нибудь объяснить?
4 ответа:
внутренние классы, если таковые имеются в вашем классе, будут скомпилированы и файл класса будет
ClassName$InnerClassName
. В случае анонимных внутренних классов, он будет отображаться как цифры. Размер класса (Java-код) не приводит к генерации нескольких классов.например, учитывая этот кусок кода:
public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; }
классы, которые будут сгенерированы будут:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss.class
обновление:
использование анонимного класса не считается плохой практикой, это просто зависит от использования.
Регистрация этой обсуждение на SO
Это потому, что у вас есть анонимные классы в этот средний класс. Они компилируются с помощью этого соглашения об именах.
посмотреть Загадка Анонимного Класса
в дополнение к вышеуказанным случаям, представленным @mprabhat, другие случаи могут быть:
- если класс содержит a перечисление переменная для этого тоже будет создан отдельный класс. Имя .сгенерированный класс будет ClassName$Name_of_enum.
- Если ваш класс X наследуется, т. е. расширяет другой класс Y, тогда был бы .класс, сгенерированный с именем ClassName$1.класс или ClassName$1$1.класс
- Если ваш класс X реализует интерфейс Y, тогда был бы .класс генерируется с именем ClassName$1.класс или ClassName$1$1.класс.
эти случаи являются производными моей проверки .файлы классов в банке.
чтобы ответить на ваш комментарий об анонимных классах плохо. Это совершенно определенно не так. Рассмотрим это, чтобы назначить прослушиватель действий для JButton:
JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... });
или это сделать нечувствительную к регистру сортировку по свойству "name"
Collections.sort( array, new Comparator<Foo>() { public int compare(Foo f1, Foo f2) { return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); } });
вы также увидите много Runnable и Callable сделано как анонимные классы.