jit 编译器与反射

jit compiler vs reflection

在研究这两个关键字的过程中,有一个地方我很困惑。

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

我了解到反射对于动态地 运行 是必要的,因为 Java 是一种静态语言。

我不知道两者在功能上的区别。 jit编译器是动态解释和编译的,但是这种动态查找class类型等信息的行为不是吗?

首先你的问题有些表述不正确

The JIT compiler interprets or compiles instructions dynamically, that is, line-by-line.

这是不正确的:

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

  2. 它“及时”(在运行时)执行。 Dynamic 是一个可能的副词,但它有点没有抓住要点。 (JIT 编译通常只发生一次...)

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

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

I learned that reflection is necessary in order to run dynamically since Java is a static language.

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

  • 使用类型转换的动态类型,instanceof
  • 动态方法调用调度
  • 通过标准 classloader
  • 的动态绑定

等等。

Reflection 允许您执行某些使用从(静态)源代码编译的常规 Java 不切实际的动态操作。但是说 需要 在 Java 中做“动态”事情是不正确的(或循环的)。


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

  • JIT 是一种实现Java语言的技术。它不会改变语言的性质,也不会改变您可以用它做什么。它根本不是关于“动态”行为。此外,Java 实现不要求包含 JIT 编译器,实际上有些实现不包含。

  • 反射是标准 Java class 库的基本组成部分。它允许您执行某些使用核心 Java 语言难以完成的“动态”操作。它肯定会影响 Java 程序的行为。


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