它使用反射,如果是这样,幕后会发生什么?JVM中如何实现'instanceof'?
4
A
回答
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] ...
当JVM有垃圾收集类,保持这个矩阵变得棘手,所以通常存储一排类对象。
Proxy classes是一个有趣的极端情况,但我最好的猜测是,代理类的定义包括生成在运行时的一些字节代码,然后通过在大多数JVM正常类加载系统进入。
相关问题
- 1. 在现代JVM实现中如何实现instanceof?
- 2. JVM如何实现IdentityHashMap?
- 3. 如何在CLR和JVM中实现Object.GetHashCode()?
- 4. 在JVM中如何实现套接字?
- 5. JVM中如何实现Java int []数组?
- 6. JVM实现JRE
- 7. 在JavaScript中实现instanceOf函数
- 8. JVM如何实现可变参数?
- 9. 如何实现instanceof作为接收字符串的函数?
- 10. 如何在Cake中实现持久JVM功能?
- 11. 如何实现和或黄瓜,JVM关系
- 12. Jython和JRuby等JVM实现如何击败其本地对手?
- 13. JVM和Java如何实现对文件的读写?
- 14. JVM重用如何实现字符串子字符串?
- 15. 通过不同的JVM接口实现
- 16. JVM实现之间的RMI兼容
- 17. 如何在Delphi中实现XIRR实现?
- 18. 你如何在你的程序中实现一个可移植的JVM?
- 19. JVM的实例
- 20. 如何检查instanceof父类?
- 21. 如何检查instanceof [Ljava.lang.String?
- 22. 节点与Chrome,实现instanceof,多个文件
- 23. INSTANCEOF的替代实现,当有'很多'子类'
- 24. 如何在QML中做“is_a”,“typeof”或instanceof?
- 25. 如何正确测试java中的instanceof
- 26. 是否有任何支持CUDA的JVM实现?
- 27. 如何检查的instanceof对象的实例,在Javascript
- 28. JVM在Flask应用中实现Python-Boilerpipe时崩溃
- 29. 如何实现
- 30. 在JavaScript中如何实现?
顺便说一句,尽量避免'instanceof'和类型结构,主要是因为性能 –