2013-10-05 6 views

ответ

9

Это часть набора инструкций JVM, в основном - есть специальная инструкция instanceof. Так, например, способ, как это:

public static void checkString(Object x) { 
    if (x instanceof String) { 
     System.out.println("Foo"); 
    } 
} 

компилируется в:

public static void checkString(java.lang.Object); 
    Code: 
    0: aload_0 
    1: instanceof #2     // class java/lang/String 
    4: ifeq   15 
    7: getstatic  #3     // Field java/lang/System.out:Ljava/io/PrintStream; 
    10: ldc   #4     // String Foo 
    12: invokevirtual #5     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
    15: return 
} 

(Это просто выход javap.)

JVM specification содержит информацию о том, что команда должна делать. См. section 6.5 для получения точной информации о инструкции. Как это реализовано до реализации VM - но один пример реализации может быть:

  • Проверьте первый операнд null (и вернуть false если да)
  • Найти тип исполнения времени объекта, который первый операнд.
  • Перейдите к иерархии типов (включая реализованные интерфейсы), пока не сможете доказать, что фактический тип либо несовместим со вторым операндом, либо несовместим с ним.
9

Jon прав относительно того, как оператор сопоставляет байт-код. Что касается реализаций, большинство JVM, представляют собой объекты в памяти как tagged unions загруженных конкретных классов:

маркированного союз, называемом также вариант, вариант запись, дискриминацию соединения, несвязный или типа суммы, является данные структура, используемая для хранения значения, которое может принимать несколько разных, но фиксированных типов.

Так x instanceof MyClassType можно ответить, посмотрев на sparse boolean matrix, который имеет набор битов, когда конкретный тип является экземпляром типа класса.

x instanceof InterfaceType несколько сложнее, но подобные методы также могут помочь в этом.

JVM может хранить большую разреженную матрицу в памяти с строкой на номинальные типы (классы или типы интерфейсов) и столбцом для типа класса.

Например:

      [all nominal types] 
        Object String Integer Number Comparable Iterable ... 
[only  String ✓  ✓      ✓ 
concrete Integer ✓    ✓  ✓  ✓ 
types]  ... 

Когда виртуальная машина должна собирать мусор классов, сохраняя эта матрица становится сложнее, так что вы обычно храните строку с объектом класса.


Proxy classes представляет собой интересный угол так, но моя догадка, что определение прокси-класс включает создание какой-то байты-кода во время выполнения, который затем проходит через нормальную систему класса нагрузки в большинстве JVM.

Смежные вопросы