同一个程序中不同jar中使用的静态类是否访问相同的数据?

Do static classes used in different jars in the same program access the same data?

好吧,标题说明了大部分内容。我进行了搜索,但大多数人并没有真正回答我要表达的意思。在 Minecraft 插件中,您制作的 jar 代码可以通过 Bukkit/Spiggot 获得 运行。如果我创建一个在多个 jar 中使用的静态 class,但在同一个程序(Bukkit)中,那么它们静态地运行并共享数据?

答案是"maybe"。

在原始 JVM 中,static class 由通用类加载器加载,因此所有对该静态 class 的引用都将引用同一个数据存储在 class.

的静态成员中

在更复杂的框架中,作用域类加载器隔离应用程序组件之间的数据可访问性。在这种情况下,两个单独的组件可能对 "same" class 有不同的引用。这里的规则变得棘手 .. 因为它很难理解,并且因为有时组件范围之间存在错误可见性可能会或可能不会 "leak" 或者可能存在您不期望的范围边界。

Jar 文件不是 Java 中的作用域或封装单元。它们只是来源,ClassLoader 可以从中加载 classes 和资源,并且可以携带额外的元数据。 Java 代码对 Jar 没有(直接)意义,如果有的话,从中加载给定的 class,一旦加载,classes 对 VM 来说是全局的*.

假设所讨论的所有 classes 都由相同或适当相关的 ClassLoaders 加载,对于每个不同的、完全合格的 ClassLoaders,VM 中最多会有一个 class 名称,所有对每个 class 名称的引用都将引用相同的 class。如果 class 有静态变量,那么它们将在访问 class.

的所有对象之间共享 然而,

*类 的范围由加载它们的 ClassLoader 决定,因此可能有不同的 classes在一个 VM 中具有相同的名称。虽然我不知道 Minecraft 的实现细节,但它似乎不太可能利用该功能。

Public classes 由相同的 classloader 加载,无论它们在哪里定义(相同或不同的 .jar、.class 等),处于同一范围内,这意味着它们可以相互访问。