使用反射获取字段值时获取异常

时间:2016-10-03 07:13:53

标签: java reflection

我需要帮助才能使用反射来获取字段的值。有一个类(SocketTest.class)有服务器套接字实现,套接字功能正常。我试图抓住这个类的socket字段,我打算调用它的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);

1 个答案:

答案 0 :(得分:0)

表达式"SocketTest".getClass()将在getClass()实例String上调用"SocketTest",该实例将返回代表类Class的{​​{1}},换句话说,相当于表达式String

然后,不清楚为什么要将String.class对象传递给Class的{​​{1}}方法。 get方法应该读取字段,因为这是在类Field中声明的字段,它需要get的实例,而不是SocketTest实例, SocketTestClass。但是,如果该字段为SocketTest.class,则您根本不需要传递任何内容,只需使用String.class

通常,您应该重新考虑您的设计。如果班级static封装了socketField.get(null)个实例,则最多可以SocketTest分发Socket,如果需要,如果不考虑为了打败封装,否则,你不应该试图用反射来抵消这个设计决定。