2016-03-31 1 views
0

まあ、タイトルはほとんどのことを言います。私は検索し、ほとんどの人は私が得ようとしているものに本当に答えません。 Minecraftプラグインでは、Bukkit/Spiggotが実行するコードのjarファイルを作成します。複数のjarファイルで同じプログラム(Bukkit)内で使用される静的クラスを作成すると、静的に動作してデータを共有するのですか?同じプログラム内の異なるJARファイルで使用される静的クラスは同じデータにアクセスしますか?

+0

答えは「いいえ」です。あなたのプログラムは* .jar *です。彼らはすべて異なったプログラムです。 – Gendarme

+0

これは、アプリケーションフレームワークとスコープ設定されたClassLoaderを使用するかどうかによって異なります。スコープ付きクラスローダーを使用するフレームワークのいくつかの例:JBoss AS、WebSphere未処理のフレームワーク:Raw JVM、Struts – PaulProgrammer

+0

@Gendarme: "program"!= "jar"プログラムはjarを使い、時々jarに集められますが、jarというプログラムは恐ろしい誤解です。 – PaulProgrammer

答えて

2

同じクラスローダーによってロードされるパブリッククラスは、定義されている場所(同じ.jar、.classなど)に関係なく、同じスコープ内にあり、互いにアクセスできます。

+0

これは、ほとんどオーバーライドできるものをオーバーライドするのに最適です。 :Dそれは考えていない私はそれについて考えて知っている。 – Lightspeed360

1

答えは「多分」です。生JVMで

静的クラスは、ユニバーサルクラスローダによってロードされ、その結果、静的クラスへのすべての参照は、そのクラスの静的メンバに格納された同一のデータを参照します。

スコープ化されたクラスローダーは、アプリケーションコンポーネント間でデータのアクセシビリティを分離します。この場合、2つの別々のコンポーネントが「同じ」クラスへの異なる参照を持つことがあります。ここでのルールは分かりにくいです。なぜなら、コンポーネントスコープ間のバグが「漏れる」かどうか、またはあなたが期待していないスコープ境界が存在する可能性があるためです。

+0

したがって、プラグインをコンパイルするBukkitの使用では、Bukkitがjarファイルを読み込みます。 –

+0

私はこの点でbukkitが何をしているのか分かりません。 – PaulProgrammer

+0

"静的"クラスとは何を意味しますか? 'Static'は、包含するインスタンスへのアクセス権を持たない内部クラスに関してクラスのために受け入れられるキーワードです。あなたの最初の声明は偽です。 "ユニバーサルクラスローダー"のようなものはありません。 – Samuel

3

Jarファイルは、Javaのスコープまたはカプセル化の単位ではありません。それらは単にClassLoaderがクラスとリソースをロードできるソースであり、追加のメタデータを運ぶことができます。 Javaコードには、あるクラスがロードされてから一度ロードされるJarがある場合、そのクラスがVMのグローバル(*)になっている(直接的な)感覚はありません。

問題のクラスがすべて同じまたは適切に関連付けられていると仮定すると、完全修飾クラス名ごとに最大でVM内に1つあります。各クラス名への参照はすべて同じクラスを参照してください。そのクラスに静的変数がある場合、そのクラスにアクセスするすべてのオブジェクト間で共有されます。

*クラスはロードされたClassLoaderによってスコープされているため、1つのVMで同じ名前の別のクラスを持つことは可能です。私がMinecraftの実装の詳細を知らないにもかかわらず、それがその能力を活用することは考えにくいようです。