同一个程序中不同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 都由相同或适当相关的 ClassLoader
s 加载,对于每个不同的、完全合格的 ClassLoader
s,VM 中最多会有一个 class 名称,所有对每个 class 名称的引用都将引用相同的 class。如果 class 有静态变量,那么它们将在访问 class.
的所有对象之间共享
然而,*类 的范围由加载它们的 ClassLoader
决定,因此可能有不同的 classes在一个 VM 中具有相同的名称。虽然我不知道 Minecraft 的实现细节,但它似乎不太可能利用该功能。
Public classes 由相同的 classloader 加载,无论它们在哪里定义(相同或不同的 .jar、.class 等),处于同一范围内,这意味着它们可以相互访问。
好吧,标题说明了大部分内容。我进行了搜索,但大多数人并没有真正回答我要表达的意思。在 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 都由相同或适当相关的 ClassLoader
s 加载,对于每个不同的、完全合格的 ClassLoader
s,VM 中最多会有一个 class 名称,所有对每个 class 名称的引用都将引用相同的 class。如果 class 有静态变量,那么它们将在访问 class.
*类 的范围由加载它们的 ClassLoader
决定,因此可能有不同的 classes在一个 VM 中具有相同的名称。虽然我不知道 Minecraft 的实现细节,但它似乎不太可能利用该功能。
Public classes 由相同的 classloader 加载,无论它们在哪里定义(相同或不同的 .jar、.class 等),处于同一范围内,这意味着它们可以相互访问。