Несколько файлов .class, сгенерированных для класса? - PullRequest
15 голосов
/ 23 июня 2009

Из любопытства, почему иногда несколько классов Java .class генерируются для класса после компиляции? Например, в моем приложении шесть классов. Для одного класса было сгенерировано всего 10 .class-файлов, начиная с MyClass # 1 до MyClass # 10.

Ответы [ 7 ]

27 голосов
/ 23 июня 2009

Это для внутренних классов и статических вложенных классов . Те, что с номерами, являются анонимными внутренними классами.

Например:


class Foo {
   class Bar { }
   static class Baz { }
   void run() {
      Helper t = new Helper() {
         int helpMethod() {
            return 2;
         }
      };
    }
}

Это создаст файлы классов Foo.class, Foo$Bar.class, Foo$Baz.class и Foo$1.class (для реализации интерфейса Helper)

5 голосов
/ 23 июня 2009

Вы получаете больше файлов .class из одного исходного файла, если

  • класс содержит внутренние классы или статические внутренние классы. Внутренние классы могут гнездиться. Их имена <outer class name>$<inner class name>.

  • внутренние интерфейсы, которые всегда статичны.

  • анонимные внутренние классы (которые на самом деле являются простыми внутренними классами без имени)

  • Интерфейсы и классы доступа к пакету до и после вашего основного класса. Вы можете иметь произвольное количество классов доступа к пакетам и интерфейсов в одном исходном файле Java. Обычно небольшие вспомогательные объекты, которые используются только классом, просто помещаются в один и тот же файл.

4 голосов
/ 23 июня 2009

Один исходный файл Java может генерировать несколько файлов классов, если ваш класс содержит внутренние классы. Анонимные внутренние классы представлены вашими пронумерованными файлами классов.

2 голосов
/ 23 июня 2009

Каждый класс в java принадлежит .java-файлу, но .java-файл может содержать несколько классов. Это включает в себя внутренние и анонимные классы. .Class-файлы, созданные для внутренних классов, содержат в своем имени символ «$». Анонимные внутренние классы получают числа.

0 голосов
/ 05 января 2018

Если существует один файл X.java и если он содержит 4 collection.sort () {}, то после компиляции X.class, X $ 1.class, X $ 2.class, X $ 3.class, X $ 4.class получить генерируемый.

В случае внутреннего класса и статического внутреннего класса генерируется больше файлов .class.

0 голосов
/ 21 ноября 2017

Чтобы добавить к ответам выше, это еще один хороший пример сгенерированных внутренних классов на основе компараторов (каждый компаратор компилируется в свой MyClass $ X.class ):

public class MyClass {
    ...

    public void doSomething() {
        ...
        Collections.sort(list, new Comparator<MyObj>() {
            public int compare(MyObj o1, MyObj o2) {
                ...
            }
        });
        ...
    }

    ...
}
0 голосов
/ 23 июня 2009

При компиляции будет сгенерировано более одного класса, только если у вашего класса есть внутренний класс.

см: Почему код Java с внутренним классом генерирует третий файл SomeClass $ 1.class?

...