Какой смысл invokeinterface?

Я не думаю, что существует простое из выполнения этого withought изменение путем системы по сути laysout текст. Самое легкое решение состояло бы в том, чтобы изменить ширину textblock и предоставить несколько дополнительных свойств как это:

<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>

Это - hacky, но он действительно работает.

65
задан itsadok 1 October 2009 в 15:34
поделиться

2 ответа

Каждый класс Java связан с таблицей виртуальных методов , которая содержит «ссылки» на байт-код каждого метода класса. Эта таблица наследуется от суперкласса определенного класса и расширяется с учетом новых методов подкласса. Например,

class BaseClass {
    public void method1() { }
    public void method2() { }
    public void method3() { }
}

class NextClass extends BaseClass {
    public void method2() { } // overridden from BaseClass
    public void method4() { }
}

приводит к таблицам

BaseClass
1. BaseClass/method1()
2. BaseClass/method2()
3. BaseClass/method3()

NextClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. NextClass/method4()

. Обратите внимание, как таблица виртуальных методов NextClass сохраняет порядок записей таблицы BaseClass и просто перезаписывает «ссылку» из method2 () , который он переопределяет.

Таким образом, реализация JVM может оптимизировать вызов invokevirtual , помня, что BaseClass / method3 () будет всегда будет третьей записью в таблице виртуальных методов любого объекта, для которого этот метод когда-либо будет вызван.

С invokeinterface эта оптимизация невозможна. Например,

interface MyInterface {
    void ifaceMethod();
}

class AnotherClass extends NextClass implements MyInterface {
    public void method4() { } // overridden from NextClass
    public void ifaceMethod() { }
}

class MyClass implements MyInterface {
    public void method5() { }
    public void ifaceMethod() { }
}

Эта иерархия классов приводит к таблицам виртуальных методов

AnotherClass
1. BaseClass/method1()
2. NextClass/method2()
3. BaseClass/method3()
4. AnotherClass/method4()
5. MyInterface/ifaceMethod()

MyClass
1. MyClass/method5()
2. MyInterface/ifaceMethod()

Как видите, AnotherClass содержит метод интерфейса в своей пятой записи, а MyClass содержит его во второй записи. вход. Чтобы найти правильную запись в таблице виртуальных методов, вызов метода с invokeinterface всегда должен будет выполнять поиск по всей таблице без возможности найти стиль оптимизации, который делает invokevirtual .

Существуют дополнительные отличия, такие как тот факт, что invokeinterface может использоваться вместе со ссылками на объекты, которые фактически не реализуют интерфейс. Следовательно, invokeinterface должен будет проверять во время выполнения, существует ли метод в таблице, и потенциально вызывать исключение. Если вы хотите глубже погрузиться в тему, я предлагаю, например, «Эффективная реализация интерфейсов Java: вызов интерфейса считается безопасным» .

91
ответ дан 24 November 2019 в 15:30
поделиться

Сравнивая обе инструкции в спецификации JVM , самое первое отличие состоит в том, что invokevirtual проверяет доступность метода во время поиска, а ] invokeinterface не работает.

1
ответ дан 24 November 2019 в 15:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: