Использует ли он отражение, и если да, то что происходит за кулисами?Как реализован «экземпляр» в JVM?
ответ
Это часть набора инструкций 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
если да) - Найти тип исполнения времени объекта, который первый операнд.
- Перейдите к иерархии типов (включая реализованные интерфейсы), пока не сможете доказать, что фактический тип либо несовместим со вторым операндом, либо несовместим с ним.
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.
- 1. Как сжатый ooP реализован в JVM?
- 2. , когда экземпляр JVM создается?
- 3. Как найти экземпляр класса в запущенном JVM
- 4. Как реализован ModelResource obj_get?
- 5. Как реализован в Python?
- 6. Javascript как `length` реализован
- 7. Получить экземпляр хранилища, загружаемого JVM по умолчанию
- 8. Экземпляр JVM для теста для Tycho - верный
- 9. Как убедиться, что в JVM есть только один экземпляр класса?
- 10. Как реализован многопользовательский режим в Java 7?
- 11. Как реализован __slots__ в Python?
- 12. Как hashCode() реализован в Java
- 13. Как своп реализован в C++
- 14. Как AsQueryable() реализован в ASP.NET
- 15. Как chsh реализован в linux?
- 16. Как int() реализован в Python?
- 17. Как реализован хэш в .NET?
- 18. Как реализован вектор в C++
- 19. Как JVM определяет экземпляр при использовании встроенной блокировки?
- 20. Как java обеспечивает только один экземпляр enum для JVM
- 21. Как перенести Sun JVM в IBM JVM
- 22. Как реализован UITableViewCellSelectionStyleGray?
- 23. Как реализован бросок Ruby?
- 24. Как реализован \ b?
- 25. Как реализован removeEventListener?
- 26. Как реализован NodeList?
- 27. Как реализован оператор string '%'?
- 28. Как реализован fma()
- 29. Как реализован OpenID?
- 30. Как реализован ACL
Кстати, старайтесь избегать конструкций 'instanceof' и typecast, в основном из-за производительности –