2016-09-20 3 views
0

クラスがJavaコードで最初に使用されたときに読み込まれることがわかりました。私はJavaコードを実行中にクラスパスを渡しています。クラス>>メイン>>新規スレッド>>コールクラスコンストラクタ>>スレッド実行コード>>存在しないクラスのオブジェクトを作成しよう>>クラスをキャッチするClassNotFoundException >>存在しないクラスをクラスパスに入れます。手動で>>そのクラスのオブジェクトを作成しようとします>> ClassNotFoundExceptionをスローします クラスパスがクラスパスディレクトリに置かれた後でも、ClassNotFoundExceptionが繰り返されます

ClassNotFoundExceptionが発生すると、必要な.classファイルがクラスパスディレクトリに置かれ、プログラムを再起動したくありません。 ClassNotFoundExceptionを獲得した後、Mainから新しいスレッドを開始してフローに従うと、正常に動作します。しかし、私は同じスレッドを使用するとうまく動作しません。

どうすれば私のプログラムは実行時にclasspathクラスファイルを再読み込みするのですか?

+0

ヒント:stackoverflowは、テキストの書式設定に**マークアップ**を使用します。 **あなたの質問にHTMLタグを入れないでください**。代わりに、ヘルプセンターに目を通して、入力をどのように書式設定できるかを理解してください!プラス:ここに**最小限の実行可能な例を置くことを検討してください。あなたの質問は興味深いと聞こえますが、私はあなたの声明を検証するために必要なコードを自分で書く時間がありません! – GhostCat

+0

なぜですか?実行時にクラスにアクセスできるのであれば、最初はクラスパス上にないのですか? – EJP

+0

@EJP私はいくつかの遠隔地から必要な.classファイルを受け取る必要があり、また私のプログラムは遠隔から受信したオブジェクトを処理する必要があるためです。 –

答えて

1

各スレッドには、Thread.currentThread().getContextClassLoader()を使用してアクセスできる独自のクラスローダーがあります。最初のスレッドはクラスローダーにクラスを持たないため、ClassNotFoundExceptionがスローされます。必要な.classファイルをクラスパスディレクトリに手動でコピーしても、スレッドはそれを認識しません。これは、プログラムが再起動されたり、新しいスレッドが作成されたりしない限り、クラスがリロードされないためです。

あなたが言及している:

キャッチClassNotFoundExceptionが>>あなたはClassNotFoundExceptionがキャッチした後、手動でクラスパスに

を非既存のクラスを入れて、あなたがコピーされるまで、スリープ状態に、現在のスレッドを入れていませんでした欠けている.classファイル?どのようにこれを処理しましたか?

+0

正確。あなたの答えは理由を完全に説明しています。今私にこの問題を解決する方法を教えてください。私は、リモートのシリアル化されたオブジェクトを受信し、そのオブジェクトのいくつかの作業を実行し、返信するwhileループを持っています。例外が発生すると、エラーオブジェクトがリモートに送信され、クラスパスにmissing .classファイルが置かれ、whileループを継続すると同じリモート直列化オブジェクトが再度受信されますが、今回は例外がスローされるべきではありません。 –

関連する問題