Складені в Java класи містять знаки долара


83

Я використовую Eclipse як свою розробницьку IDE. Я також використовую його для експорту моєї програми у файл .jar. Коли я переглядаю свої класи у файлі .jar, кілька моїх класів містять назву цього класу, знак долара, а потім число. Приклад:

  • Знайдіть $ 1.клас
  • Знайдіть 2.клас
  • Знайдіть 3.клас
  • Знайти.клас

Я помітив, що це робиться на більших класах. Це тому, що класи стають настільки великими, що він компілює їх у кілька класів? Я гуглив і переглядав кілька форумів і шукав Документацію Java, але не знайшов нічого, навіть пов’язаного з цим. Хтось може пояснити?


Зразок коду для тестування цього випуску github.com/Aksi0m/SampleFor123686419
Прагс 02

Відповідно до відповіді команди Google Issetracker.google.com/issues/123736741 , це виправлено внутрішньо і буде доступно в наступному випуску Навігації.
Prags,

Відповіді:


111

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

Наприклад, отримавши цей шматок коду:

public class TestInnerOuterClass {
    class TestInnerChild{

    }

    Serializable annoymousTest = new Serializable() {
    };
}

Класи, які будуть генеруватися, будуть:

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

Оновлення:

Використання анонімного класу не вважається поганою практикою, воно лише залежить від використання.

Перевірте це обговорення на SO


1
Добре, так чи погано мати анонімний клас? Я не зовсім розумію, як це працює. Якщо я створюю нову змінну екземпляра класу в класі, це анонімний клас?
Frizinator

Ні, непогано мати анонімний клас, це залежить від використання. Оновив мій пост
mprabhat

4
Перерахування, що містять тіло класу, автоматично генерують анонімний внутрішній клас, який розширює клас перелічення, і, таким чином, генерують інший файл класу з $.
dlaidlaw

1
Також якщо внутрішній клас приватний, генерується додатковий клас з назвою OuterClass $ 1.class
SandeepGodara

@mprabhat: чи існує який-небудь механізм в android studio для перегляду ієрархії або списку цих класів?
user1090751 05.03.18


9

На додаток до вищезазначених випадків, представлених @mprabhat, іншими справами можуть бути:

  1. якщо ваш клас містить змінну enum, для цього теж буде створений окремий клас. Ім'я згенерованого .class буде ім'ям класу $ Name_of_enum .
  2. Якщо ваш клас X успадковує, тобто розширює інший клас Y , тоді буде створено .class з іменем ClassName $ 1.class або ClassName $ 1 $ 1.class
  3. Якщо ваш клас X реалізує інтерфейс Y , тоді буде створений .class з іменем ClassName $ 1.class або ClassName $ 1 $ 1.class .

Ці випадки є похідними мого огляду файлів .class у jar.


У мене є клас, який не відповідає жодному з цих критеріїв, і class.getName () все ще помиляється - для Group.java він повертає Group _ $$ _ jvst248_20. Я не уявляю, що відбувається. Безумовно, немає перелічень, розширень чи реалізацій.
Амальговінус,

0

Відповісти на ваш коментар щодо анонімних класів погано. Вони, безумовно, ні. Розгляньте це, щоб призначити прослуховувач дії для 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, виконаних як анонімні класи.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.