java - jit 编译器与反射
问题描述
在研究这两个关键词时,有一部分让我感到困惑。
jit 编译器动态解释或编译指令,即逐行。
我了解到反射是动态运行所必需的,因为 Java 是一种静态语言。
我不知道两者之间的功能差异。jit编译器是动态解释编译的,但这不就是动态查找类类型等信息的行为吗?
解决方案
首先,您的问题中有一些不正确的陈述。
JIT 编译器动态解释或编译指令,即逐行。
这是不正确的:
JIT 编译器将代码从字节码编译为本机代码。它不解释代码。
它“及时”(在运行时)执行此操作。动态是一个可能的副词,但它有点错过了重点。(JIT 编译通常只发生一次......)
JIT 编译不会“逐行”发生。JIT 编译的粒度是一个完整的方法。
JIT 编译对程序也是透明的。它不会改变程序的行为方式......除了让它运行得更快。
我了解到反射是动态运行所必需的,因为 Java 是一种静态语言。
这也是不正确的。Java 在许多方面都是动态的,没有反射。例如,Java 语言支持:
- 使用类型转换的动态类型,
instanceof
- 动态方法调用调度
- 通过标准类加载器进行动态绑定
等等。
反射允许您执行某些使用从(静态)源代码编译的常规 Java 不实用的动态事情。但是说反射对于在 Java 中做“动态”事情是必要的是不正确的(或循环的)。
实际上,反射和 JIT 是无关的:
JIT 是一种用于实现 Java 语言的技术。它不会改变语言的性质,或者你可以用它做什么。这根本不是关于“动态”行为。此外,Java 实现不需要包含 JIT 编译器,而且确实有些实现不包含。
反射是标准 Java 类库的基本部分。它允许您做一些用核心 Java 语言难以做到的“动态”事情。它肯定会影响 Java 程序的行为。
最后,您将观察到“动态”在不同的上下文中具有广泛的含义。您需要注意不要将上下文中的含义混为一谈。(对于母语不是英语的人来说,这不是一件容易的事......)
推荐阅读
- sql - sql中的脚本优化
- vb.net - VS2017/VB.NET:将枚举计数分配给常量
- r - 如何在每个面板上绘制平均线?
- c - 使用 GDB 打印/观察大型代码库文件中的变量?
- c# - 为什么 Oledb Connection.Close() 执行时间太长?
- python - python中一个单词字符串的字母n-gram程序
- javascript - MutationObservers 只听本地变化吗?
- ruby-on-rails - 用户未定义的局部变量或方法“act_as_votable”(调用“User.connection”建立连接):类
- python - 关闭第二个窗口后如何清空 RAM?
- security - 如果我将 gitlab-ci 用于我的私有存储库,它是否仍然是私有的?