- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据这篇文章http://slurp.doc.ic.ac.uk/pubs/observing/linking.html#assignment :
Due to the differences in information between Java code and bytecode (bytecode does not contain the types of local variables), the verifier does not need to check subtypes for assignments to local variables, or to parameters.
我的问题:为什么字节码不包含局部变量的类型信息,而它确实包含参数和返回值的类型信息?
最佳答案
首先,有几种不同的类型概念。有编译时类型,其中包括泛型。但是,泛型在编译时间后不存在。
有一个变量的验证推断静态类型,可以是int、float、long、double、returnaddress,也可以是对象引用。对象引用还带有上限类型,因此所有引用都是 java/lang/String
的子类型。字段还可以具有短类型之一:byte、short、char 或 boolean。出于执行目的,它们与 int 相同,但具有不同的存储空间。
最后是运行时类型,它与经过验证的静态类型相同,但在对象引用的情况下,表示被引用实例的实际类型。请注意,由于验证者惰性,在某些情况下,运行时类型实际上可能不是已验证类型的子类型。例如,声明类型为 Comparable
的变量实际上可以保存 Hotspot 中的任何对象,因为 VM 不会在验证时检查接口(interface)。
除非通过用于反射和调试的可选属性,否则不会保留编译时信息。这是因为没有理由保留它。
局部变量没有明确的类型信息(新的 StackMapTable 属性除外,但这是技术问题)。相反,当类被加载时,字节码 validator 通过运行静态数据流分析来推断每个值的类型。这样做的目的不是像编译时类型检查那样捕获错误,因为假定字节码在编译时已经通过了这种检查。
相反,验证的目的是确保指令对 VM 本身没有危险。例如,它需要确保您没有使用整数并将其作为对象引用进行解释,因为这可能会导致任意内存访问和入侵 VM。
因此,虽然字节码值没有显式类型信息,但它们确实具有隐式类型,这是静态类型推断的结果。虽然它们应该遵循 JVM 标准,但其细节因每个 VM 的内部实现细节而异。但您只需要担心手写字节码。
字段具有显式类型,因为 VM 需要知道其中存储的数据类型。方法参数和返回类型被编码在所谓的方法描述符中,也用于类型检查。它们不可能自动推断,因为这些值可以来自或去往任何地方,而类型检查是在每个类的基础上完成的。
附言在谈论验证类型时,我遗漏了一些小细节。对象类型还跟踪它们是否已被初始化,如果未初始化,则由哪条指令创建它们。地址类型跟踪创建它们的 jsr 的目标。
关于Java 字节码 : types of local variables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16001584/
int i = 1; int main() { int i = 2; { int i = 3; cout 值为 3)。您能做的最好的事情就是在它仍在范
我可以手动为某些应用程序设置 $locale 吗? 支持本地化的唯一方法是否可能是包含当前语言环境的 Angular 库中的本地化文件。如果存在多种文化怎么办?在这种情况下我必须动态加载本地化文件?我
我有两台机器。一个使用 CUPS 1.5.0,另一个使用 CUPS 1.6.1。两台机器位于同一本地网络上。我想要完全发现网络上的打印机。如果我运行以下命令: CUPS_DEBUG_LEVEL=2 /
所以我基本上是这样做的。 OObjectDatabaseTx result = OObjectDatabasePool.global().acquire( "local:orientdb", "adm
控制台日志重新显示此错误 tsega/meteor-bootstrap3-datetimepicker TypeError: locale() locale it is not loaded from
我在使用 express 4 时很困惑。我使用 express-generator 来生成我的项目。根目录下有app.js,路由器文件有index.js。但是网上关于express的教程都是直接在
问题:直接使用 SimpleDateFormat,无需明确的语言环境Id:SimpleDateFormat SimpleDateFormat format = new SimpleDateFormat
这里的代码在 Python 中,但在使用语言环境的 C/C++ 中的行为应该是相同的。 >>> import locale >>> locale.setlocale(locale.LC_ALL, "f
根据 app-localize-behavior 的 polymer 文档 Each element that displays content to be localized should add
起初我从 this tutorial 实现 l10n到 Flutter 的模板项目文件,这是成功的。之后,我尝试将 MyHomePage 类移动到名为 home.dart 的新文件中。它停止工作是因为
我正在使用源代码中的Postgres 13(Rel_13_STRATE分支),并且我使用的是来自apachea/age源代码的(Release/PG13/1.3.0分支)中的1.3.0版的Apache
我有: 基于节点Express的Web服务器,应仅在用户的本地计算机上运行 一个 Angular 客户端应用程序,它将GET Http请求发送到该本地Web服务器以获取JSON中的数据并将其显示在浏览
问了一些类似的问题,但我的问题是,如果我想传播不同路由中间件的中间结果,最好的方法是什么? app.use(f1); app.use(f2); app.use(f3); function f1(req
我注意到我的本地变量中有从服务器收到的本地变量的副本。例如 Object { settings: "4.2", env: "development", utils: true,
我的网卡不稳定,尤其是从休眠状态恢复后,有时会掉线。退出对应于Vista的网络状态,在通知区域中显示为“仅限本地”。是否可以通过编程方式检索这些状态值(例如“有限连接”,“仅本地”,“本地和Inter
你好想知道在模板中是否有一种简单的方法来访问当前翻译的 lang 字符串。 最佳答案 您可以使用 I18n.locale 访问它. 所以在 ERB 中...... ...在 HAML 中: = I1
我在 Django 中工作。在 Django 中,当您渲染模板时,您向其发送一个上下文字典以进行替换。因为我很懒/干,所以我经常使用 locals() 作为快捷方式,而不是发送看起来像 {'my_va
我一直在尝试让 Java 根据语言环境转换数字。偶遇this post这在很大程度上帮助了我预先理解这一点,我设计了自己的方法将数字转换为特定的语言环境(根据关于这个主题的其他混淆讨论) 所以假设我有
当我运行“hadoop job -status xxx”时,输出以下一些列表。 Rack-local map tasks=124 Data-local map tasks=6 Rack-local m
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 3个月前关闭。 Improve
我是一名优秀的程序员,十分优秀!