我需要帮助来使用反射获取字段的值。有一个类(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);
"SocketTest".getClass()
将在String
实例上调用getClass()
"SocketTest"
,这将返回表示类String
的Class
,换句话说,等价于表达式String.class
。
然后,不清楚为什么要将Class
对象传递给Field
的get
方法。get
方法应该读取字段,并且由于这是在类SocketTest
中声明的字段,因此它需要一个SocketTest
的实例,而不是Class
实例,既不SocketTest.class
也不String.class
。但是,如果字段static
,则根本不需要传递任何内容,只需使用socketField.get(null)
即可。
通常,您应该重新考虑您的设计。如果类SocketTest
封装了一个Socket
实例,则由SocketTest
来分发一个InputStream
,如果需要,并且如果这不被认为会破坏封装,否则,您不应该尝试使用 Reflection 来抵消此设计决策。