3

我在阅读一本我不理解的 Java 书籍时偶然发现了这段摘录,名为Java Buzzwords 。

动态的

Java 程序带有大量的运行时类型信息,这些信息用于在运行时验证和解析对对象的访问。这使得以安全和方便的方式动态链接代码成为可能。这对于 Java 环境的健壮性至关重要,其中字节码的小片段可以在运行的系统上动态更新。

我的问题是:

  1. “运行时类型信息”是什么 意思?如果提供一个例子,我将不胜感激。
  2. “字节码的小片段可能会在正在运行的系统上动态更新。” 根据我的理解,当我们使用javac命令时,Java 代码会被转换为字节码,并通过java命令执行。那么为什么/如何在正在运行的系统上更新字节码片段呢?
4

3 回答 3

7
  1. 变量的compile-time type是它被声明为的runtime type类型,而 是变量指向的实际对象的类型。假设我们有以下内容:

    对象 obj = new Integer(1);

    compile-time类型oObject,而它的运行时类型是Integer

  2. “字节码的小片段可能会在正在运行的系统上动态更新。”

    这基本上意味着在调试一些java程序时,您可以进行一些更改并重新编译程序然后再次运行它,而无需重新启动JVM。

于 2013-07-12T15:05:02.773 回答
4
  1. JVM 和运行在 JVM 上的 Java 程序可以获取对象的实际类型。在 Java 中,如果一个对象实际上没有这种类型,就不可能假装它具有给定的类型。JVM 将检查并检测到,并抛出异常。

  2. 在调试一些正在运行的代码时,即使是远程调试,也可以修改正在运行的源代码,对其进行编译,并告诉 JVM 重新加载字节码,而无需停止并重新启动程序。Java EE 容器和许多框架也在运行时生成字节码并将其加载到正在运行的 JVM 中。

于 2013-07-12T15:02:37.443 回答
2

除了其他人已经说过的 2) 的一些进一步信息来源:

  1. Eclipselink 页面上关于编织的使用
  2. ASM可能是最流行的字节码操作框架。
于 2013-07-12T15:10:04.340 回答