Что такое «эмуляция внутреннего класса» в Java? - PullRequest
6 голосов
/ 18 декабря 2010

только что нашел этот бит, читая документацию eclipse JDT :

IMethodBinding.getParameterTypes():. , , Примечание. Результат не включает синтетические параметры, введенные эмуляцией внутреннего класса .

Я не могу найти ссылку на эмуляцию внутреннего класса в JLS ... Кто-нибудь знает, что это за эмуляция? Бросок примера тоже поможет. :)

Ответы [ 2 ]

4 голосов
/ 18 декабря 2010

Я думаю, что автор документации по Eclipse немного разбирается в терминологии.Что касается JLS, внутренний класс является внутренним классом и не нуждается в эмуляции.

Однако в способе реализации внутренних классов реализована небольшая хитрость1004 * типичной JVM, и именно здесь параметры синтетического конструктора входят в уравнение.Что происходит, так это то, что JVM реализует классы одинаково, независимо от того, вложены они или нет.Не существует специальных байт-кодов для ссылки на переменные во включающих классах, поэтому компиляторы генерируют код, который извлекает их через синтетические атрибуты.

Дополнительные сведения можно найти в исходной спецификации внутренних классов Sun Java 1.1 .

2 голосов
/ 18 декабря 2010

Я подозреваю, что «эмуляция внутреннего класса» предназначена для того, чтобы компилятор генерировал байтовый код для внутренних классов.
На уровне виртуальных машин нет поддержки внутренних классов (по крайней мере, когда они были представлены). При компиляции внутреннего класса компилятор должен генерировать байт-код, как для нормального класса. Добавление ссылки на экземпляр внешнего класса, например:

public class Outer {

    class Inner {
        @Override
        public String toString() {
            return "Inner";
        }
    }
}

Внутренний класс компилируется во что-то похожее на:

class Outer$Inner {
    final Outer this$0;  // the instance of the outer class

    Outer$Inner(Outer outer) {
        super();
        this$0 = outer;
    }

    public String toString() {
        return "Inner";
    }
}
...