Java скомпилированные классы содержат знаки доллара
Я использую Eclipse в качестве моей IDE разработки. Я также использую его для экспорта моего приложения в файл .jar. Когда я смотрю на свои классы в файле .jar, некоторые из моих классов содержат имя этого класса, знак доллара, а затем номер. Пример:
- Найти $1.class
- Найти $2.class
- Найти $3.class
- Find.class
Я заметил, что это делается на больших классах. Это потому, что классы становятся настолько большими, что компилирует его в несколько классов? Я googled и смотрел на нескольких форумах, и искал документацию Java, но не нашел ничего даже связанного с ним. Может кто-нибудь объяснить?
Ответы
Ответ 1
Внутренние классы, если они присутствуют в вашем классе, будут скомпилированы, а файл класса будет ClassName$InnerClassName
. В случае анонимных внутренних классов он будет отображаться как числа. Размер класса (код Java) не приводит к генерации нескольких классов.
например. с учетом этой части кода:
public class TestInnerOuterClass {
class TestInnerChild{
}
Serializable annoymousTest = new Serializable() {
};
}
Классы, которые будут сгенерированы, будут:
-
TestInnerOuterClass.class
-
TestInnerOuterClass$TestInnerChild.class
-
TestInnerOuterCasss$1.class
Обновление:
Использование анонимного класса не считается плохой практикой, оно просто зависит от использования.
Отметьте это обсуждение SO
Ответ 2
Это потому, что у вас есть анонимные классы в этом более крупном классе. Они компилируются с использованием этого соглашения об именах.
Смотрите Анонимный головоломка класса
Ответ 3
В дополнение к вышеуказанным случаям, представленным @mprabhat, другие случаи могут быть:
- Если класс содержит переменную enum, для этого также будет создан отдельный класс. Имя сгенерированного .class будет ClassName $Name_of_enum.
- Если ваш класс X наследует, то есть расширяет другой класс Y, тогда будет класс .class, сгенерированный с именем ClassName $1.class или ClassName $1 $1.class
- Если ваш класс X реализует интерфейс Y, тогда будет создан класс .class с именем ClassName $1.class или ИмяКласса $1 $1.class.
Эти случаи являются выводами моей проверки на файлы .class в jar.
Ответ 4
Чтобы ответить на ваш комментарий, анонимные классы плохо. Их больше всего нет.
Рассмотрим это, чтобы назначить прослушиватель действий 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, выполненных как анонимные классы.