【发布时间】:2013-04-06 18:21:26
【问题描述】:
据本文http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#assignment:
由于Java代码和字节码的信息差异 (字节码不包含局部变量的类型),验证者 不需要检查子类型是否分配给局部变量,或者 到参数。
我的问题:为什么字节码不包含局部变量的类型信息,而它确实包含参数和返回值的类型信息?
【问题讨论】:
-
我怀疑在
compile-time检查了类型值,导致代码不再需要类型值信息,只需要二进制数据。然而,方法参数和返回值在run-time调用,并且需要用于类型检查的信息 -
谢谢,有道理!
-
因为它就是这样。 JDK 验证程序使用数据流分析来找出每个数据使用的“到达”类型。参数和实例/静态变量需要声明类型才能输入数据流。计算结果的类型OTOH可以由规则确定。除此之外,本地变量在编译时通常会消失在堆栈值中。