Я не думаю, что существует простое из выполнения этого withought изменение путем системы по сути laysout текст. Самое легкое решение состояло бы в том, чтобы изменить ширину textblock и предоставить несколько дополнительных свойств как это:
<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>
Это - hacky, но он действительно работает.
Каждый класс 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: вызов интерфейса считается безопасным» .
Сравнивая обе инструкции в спецификации JVM , самое первое отличие состоит в том, что invokevirtual
проверяет доступность метода во время поиска, а ] invokeinterface
не работает.