Несколько файлов .class, сгенерированных для одного класса?

StackOverflow https://stackoverflow.com/questions/1031962

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Например:


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)

Другие советы

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

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

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

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

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

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

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

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

public class MyClass {
    ...

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

    ...
}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top