Tomcat で 2 つの Java アプリケーションを実行している場合。アプリケーションAとB.アプリケーションAに静的変数を持つパブリッククラスがあり、アプリケーションBがそれにアクセスできます。そうでない場合、なぜですか?
インタビューでこう聞かれました。アクセスできないと言っていました。しかし、私はその理由を知りませんでしたか?
誰でも正しい答えを手伝ってもらえますか。
JVMは同じですが、各アプリケーションには独自のクラスローダーがあるためです。クラスローダの詳細について は、Java クラスローダとは?を参照してください。
各アプリケーション ウォーには個別のクラス ローダーがあるため、別のメソッドにアクセスすることはできません。
ただし、これは RMI や HTTP Web サービスなどを使用して行うことができます。
各 WebApp が独自のクラスローダー (Tomcat システム) に割り当てられているためです。
についての正確な質問static
:
重要なのは、ClassLoaders がどのように構成されているかです。1 つの JVM 内の 2 つの ClassLoader がそれぞれクラスをロードすることは完全に可能であり、したがって静的フィールドの別個の独立したコピーが含まれます。
できるだけ簡単に言いましょう。
質問:静的変数にどのようにアクセスしますか? 回答:間違いなくクラス名を使用しています。
以下のclass
とおりです。
package com.package1;
public ClassA {
public static String GLOBAL_VARIABLE= "TEST";
}
質問: JVM は ClassA をどのように認識しますか。 回答: ClassLoaderForA.com.package1.ClassA として表示されます
これがApplication1のクラスローダーを使用してロードされたと仮定します
ここで、2 番目のアプリケーションのクラス ローダーの場合、ClassA
は存在しません。それは見つかりません。では、どのようにして静的フィールドを取得できますかClassA
場合によります。私の意見では、質問ははい/いいえで答えるほど明確ではありません。
アプリケーションが何らかの方法で変数を公開する場合、当然、他のアプリケーションは値を取得するように要求できます。しかし、これは質問が対象とするはずだったものではありません。しかし、それを覚えておいてください。インタビューでは、批判的かつ既成概念にとらわれずに考えることができることを証明することは常に良いことだとわかりました。
彼らは、あなたが static 変数とClassLoader
s の概念を理解しているかどうかを見たかったのでしょう。Java アプリケーションは動的にリンクされます。つまり、実行時にClassLoader
(アプリケーションによって異なります) がリンクを実行し、すべてのライブラリをロードするか、ロードを委譲します。静的変数はクラスによって参照されます。静的変数にアクセスしようとすると、クラスはクラスClassLoader
を見つけてロードしようとします。各アプリケーションには独自の がClassLoader
あるため、各アプリケーションには独自の変数セットがあります。
これは、古い言語に見られるアドレス空間の分離の原則と同じです。アプリケーションは、同じマシンでホストされている場合でも、別のアドレス空間で実行されます。したがって、互いに並行して実行される 2 つのアプリケーションは、他のアプリケーションのアドレス空間内の変数を単純にアドレス指定することはできません。これは、複数のウォッチドッグによって強制される制約に違反するためです。ただし、アドレス空間は明示的に共有できることに注意してください。