Несколько файлов .class, сгенерированных для одного класса?
Вопрос
Из любопытства, почему иногда для класса после компиляции генерируется несколько файлов 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?