2016-10-03 87 views
0

我需要使用反射獲取字段值的幫助。有一個類(SocketTest.class),它具有服務器套接字實現,套接字功能工作正常。我試圖找到這個類的套接字字段,我打算調用它的getInputStream()方法來接受輸入。下面的代碼是給我IllegalArgumentException - 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

表達"SocketTest".getClass()將調用getClass()String實例"SocketTest",這將返回表示該類String,換句話說Class,相當於表達String.class

然後,您不清楚爲什麼您將Class對象傳遞給Fieldget方法。 get方法應該讀取該字段,並且由於這是在類SocketTest中聲明的字段,所以它需要SocketTest的實例,而不是Class實例,既不是SocketTest.class也不是String.class。但是,如果該字段爲static,則根本不需要傳遞任何內容,則可以使用socketField.get(null)

通常,您應該重新考慮您的設計。如果SocketTest類封裝了Socket實例,那麼最多可以使用SocketTest來發布InputStream,如果需要的話如果這不被認爲是破壞封裝,否則您不應該嘗試使用反射來抵消此設計決策。

+0

謝謝Holger。我明白,在這種情況下,我需要傳遞一個SocketTest實例作爲參數來獲取方法。由於SocketTest.class不會返回實例,那麼是否有任何方法來獲取現有實例(考慮到在SocketTest類中不能進行更改)。 –

+0

沒有這樣的「搜索現有實例」功能。你甚至不知道你爲什麼假設,有一個現存的實例。怎麼樣創建一個實例? – Holger

+0

在運行時,SocketTest會在特定的端口上創建套接字連接。所以我在想,爲了獲得該套接字的輸入流,我需要現有的SocketTest實例。用新的實例,我會得到新的套接字連接(不是用戶將連接的地方)。 –