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, выполненных как анонимные классы.