2016-10-03 86 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实例。用新的实例,我会得到新的套接字连接(不是用户将连接的地方)。 –