скомпилированные классы java содержат знаки доллара


Я использую Eclipse в качестве среды разработки. Я также использовать это, чтобы экспортировать свою заявку на .файл jar. Когда я смотрю на свои занятия в школе .jar-файл, некоторые из моих классов содержат имя этого класса, знак доллара, а затем номер. Пример:

  • найти$1.класс
  • найти$2.класс
  • найти$3.класс
  • найти.класс

Я заметил, что он делает это на больших классах. Это потому, что классы становятся настолько большими, что он компилируется это в несколько классов? Я искал и смотрел на нескольких форумах, и искал документацию Java, но не нашел ничего, даже связанного с ней. Может кто-нибудь объяснить?

4 62

4 ответа:

внутренние классы, если таковые имеются в вашем классе, будут скомпилированы и файл класса будет ClassName$InnerClassName. В случае анонимных внутренних классов, он будет отображаться как цифры. Размер класса (Java-код) не приводит к генерации нескольких классов.

например, учитывая этот кусок кода:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

классы, которые будут сгенерированы будут:

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

обновление:

использование анонимного класса не считается плохой практикой, это просто зависит от использования.

Регистрация этой обсуждение на SO

Это потому, что у вас есть анонимные классы в этот средний класс. Они компилируются с помощью этого соглашения об именах.

посмотреть Загадка Анонимного Класса

в дополнение к вышеуказанным случаям, представленным @mprabhat, другие случаи могут быть:

  1. если класс содержит a перечисление переменная для этого тоже будет создан отдельный класс. Имя .сгенерированный класс будет ClassName$Name_of_enum.
  2. Если ваш класс X наследуется, т. е. расширяет другой класс Y, тогда был бы .класс, сгенерированный с именем ClassName$1.класс или ClassName$1$1.класс
  3. Если ваш класс 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 сделано как анонимные классы.