2016-10-03 2 views
0

Ich brauche Hilfe, um den Wert eines Feldes mit Reflektion zu erhalten. Es gibt eine Klasse (SocketTest.class), die eine Server-Socket-Implementierung hat, die Socket-Funktionalität funktioniert gut. Ich versuche, ein Socket-Feld dieser Klasse zu erhalten, und ich beabsichtige, die Methode getInputStream() aufzurufen, um Eingaben zu akzeptieren. Folgenden Code gibt mir IllegalArgumentException - Can not set java.net.Socket field com.test.SocketTest.socket to java.lang.ClassException erhalten, während Wert eines Feldes mit Hilfe der Reflektion erhalten wird

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

Antwort

0

Der Ausdruck "SocketTest".getClass() wird getClass() auf der String Instanz aufrufen "SocketTest", die die Class kehrt die Klasse String, mit anderen Worten repräsentiert ist, entspricht dem Ausdruck String.class.

Dann ist es nicht klar, warum Sie das Class Objekt an die get Methode der Field übergeben. Die get Methode soll das Feld lesen und da dies ein Feld ist, das in der Klasse SocketTest deklariert ist, benötigt es eine Instanz von SocketTest, keine Class Instanz, weder SocketTest.class noch String.class. Wenn das Feld jedoch static ist, müssen Sie überhaupt nichts weiterleiten, Sie können einfach socketField.get(null) verwenden.

Generell sollten Sie Ihr Design überdenken. Wenn die Klasse SocketTest eine Socket Instanz einkapselt, ist es SocketTest, falls gewünscht eine InputStream auszugeben, und wenn dies nicht als die Kapselung zu verhindern gilt, andernfalls sollten Sie nicht versuchen, dieser Designentscheidung mit Reflection entgegenzuwirken.

+0

Danke Holger. Ich verstehe, dass ich in diesem Fall eine Instanz von SocketTest als Parameter übergeben müsste, um die Methode zu erhalten. Da SocketTest.class keine Instanz zurückgibt, gibt es eine Möglichkeit, eine vorhandene Instanz zu erhalten (in der SocketTest-Klasse können keine Änderungen vorgenommen werden). –

+0

Es gibt keine solche "Suche nach einer vorhandenen Instanz" -Funktion. Es ist nicht einmal klar, warum Sie annehmen, dass es überhaupt eine existierende Instanz gibt. Was ist mit dem Erstellen einer Instanz? – Holger

+0

Zur Laufzeit würde SocketTest eine Socket-Verbindung an einem bestimmten Port erstellen. Also dachte ich mir, dass ich eine vorhandene Instanz von SocketTest benötigen würde, um einen Eingabestream dieses Sockets zu erhalten. Mit einer neuen Instanz würde ich eine neue Socket-Verbindung erhalten (nicht dort, wo der Benutzer verbunden wäre). –

Verwandte Themen