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

时间:2016-03-31 19:16:09

标签: java minecraft bukkit

嗯,标题大部分都是这样说的。我搜索过,而且大多数人并没有真正回答我想要达到的目标。在Minecraft插件中,您可以制作由Bukkit / Spiggot运行的代码。如果我创建一个在多个jar中使用但在同一个程序(Bukkit)中使用的静态类,那么它们是静态操作还是共享数据?

3 个答案:

答案 0 :(得分:3)

Jar文件不是Java中作用域或封装的单元。它们只是angular.forEach(vm.testData, function(item,index){ item.newKey = "newValue" } 可以加载类和资源的源,并且可以携带额外的元数据。 Java代码没有(直接)意义上的Jar,如果有的话,从中加载了给定的类,并且一旦加载,类就是VM * 的全局。

假设所讨论的所有类都由相同或适当相关的display:inline-block 加载,VM中最多只有一个用于每个不同的,完全限定的类名,以及对每个类的所有引用类名称将引用同一个类。如果该类具有静态变量,则它们将在访问该类的所有对象之间共享。

* 但是,类加载了它们的ClassLoader范围,因此可以在一个VM中使用具有相同名称的不同类。虽然我不了解Minecraft的实现细节,但它似乎不太可能利用这种能力。

答案 1 :(得分:2)

由同一个类加载器加载的公共类,无论它们在何处定义(相同或不同.jar,.class等),都在同一范围内,这意味着它们可以相互访问。

答案 2 :(得分:1)

答案是“也许”。

在原始JVM中, static 类由通用ClassLoader加载,因此对该静态类的所有引用都将引用存储在该类的静态成员中的相同数据。

在更复杂的框架中,作用域ClassLoader将应用程序组件之间的数据可访问性分开。在这种情况下,两个单独的组件可能对“相同”类具有不同的引用。这里的规则变得棘手......因为它很难理解,并且因为有时组件范围之间存在缺陷可见性可能会或者可能不会“泄漏”,或者可能存在您不期望的范围边界。