2016-10-03 11 views
0

リフレクションを使用してフィールドの値を取得する際に助けが必要です。サーバーソケットの実装を持つクラス(SocketTest.class)があり、ソケットの機能は正常に動作しています。このクラスのソケットフィールドを取得しようとしているので、getInputStream()メソッドを呼び出して入力を受け入れようとしています。次のコードは私にIllegalArgumentException与えている - つまりクラスStringを表すClass返される、Stringインスタンス"SocketTest"getClass()を起動する表現"SocketTest".getClass()Can not set java.net.Socket field com.test.SocketTest.socket to java.lang.Classリフレクションを使用してフィールドの値を取得中に例外を取得する

Field socketField = SocketTest.class.getDeclaredField("socket"); 
socketField.setAccessible(true); 
Class<?> socketTest = "SocketTest".getClass(); 
Socket socket = (Socket)socketField.get(socketTest); 

答えて

0

を、表現String.classと同等です。

ClassオブジェクトをgetFieldメソッドに渡す理由がわかりません。 getメソッドはフィールドを読み取るはずであり、これはクラスSocketTestで宣言されたフィールドなので、インスタンスではなく、SocketTestのインスタンスが必要です。SocketTest.classでもString.classもありません。ただし、フィールドがstaticの場合は、何も渡す必要はありません。socketField.get(null)を使用することができます。

一般的に、デザインを再考する必要があります。 SocketTestSocketインスタンスをカプセル化する場合は、SocketTestにはInputStreamを、必要に応じてを代入すると、はカプセル化を無効にするとみなされません。そうでなければ、Reflectionを使用してこの設計上の決定に対処しないでください。

+0

ありがとう、ホルガー。私はこの場合、メソッドを取得するためのパラメータとしてSocketTestのインスタンスを渡す必要があることを理解しています。 SocketTest.classはインスタンスを返さないため、既存のインスタンスを取得する方法はありません(SocketTestクラスで変更を行うことはできないと考えている)。 –

+0

「既存インスタンスの検索」機能はありません。なぜあなたが仮定しているのか、既存のインスタンスがまったく存在しないことさえ明らかではありません。インスタンスの作成はどうですか? – Holger

+0

実行時に、SocketTestは特定のポートにソケット接続を作成します。だから私は、そのソケットの入力ストリームを取得するために、私はSocketTestの既存のインスタンスが必要になると考えていました。新しいインスタンスでは、新しいソケット接続(ユーザーが接続される場所ではない)を取得します。 –

関連する問題