首页 > 解决方案 > jit 编译器与反射

问题描述

在研究这两个关键词时,有一部分让我感到困惑。

jit 编译器动态解释或编译指令,即逐行。

我了解到反射是动态运行所必需的,因为 Java 是一种静态语言。

我不知道两者之间的功能差异。jit编译器是动态解释编译的,但这不就是动态查找类类型等信息的行为吗?

标签: javareflectioncompiler-constructionjvm

解决方案


首先,您的问题中有一些不正确的陈述。

JIT 编译器动态解释或编译指令,即逐行。

这是不正确的:

  1. JIT 编译器将代码从字节码编译为本机代码。它不解释代码。

  2. 它“及时”(在运行时)执行此操作。动态是一个可能的副词,但它有点错过了重点。(JIT 编译通常只发生一次......)

  3. JIT 编译不会“逐行”发生。JIT 编译的粒度是一个完整的方法。

JIT 编译对程序也是透明的。它不会改变程序的行为方式......除了让它运行得更快。

我了解到反射是动态运行所必需的,因为 Java 是一种静态语言。

这也是不正确的。Java 在许多方面都是动态的,没有反射。例如,Java 语言支持:

  • 使用类型转换的动态类型,instanceof
  • 动态方法调用调度
  • 通过标准类加载器进行动态绑定

等等。

反射允许您执行某些使用从(静态)源代码编译的常规 Java 不实用的动态事情。但是说反射对于在 Java 中做“动态”事情是必要的是不正确的(或循环的)。


实际上,反射和 JIT 是无关的:

  • JIT 是一种用于实现 Java 语言的技术。它不会改变语言的性质,或者你可以用它做什么。这根本不是关于“动态”行为。此外,Java 实现不需要包含 JIT 编译器,而且确实有些实现不包含。

  • 反射是标准 Java 类库的基本部分。它允许您做一些用核心 Java 语言难以做到的“动态”事情。它肯定会影响 Java 程序的行为。


最后,您将观察到“动态”在不同的上下文中具有广泛的含义。您需要注意不要将上下文中的含义混为一谈。(对于母语不是英语的人来说,这不是一件容易的事......)


推荐阅读