2016-10-03 2 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", который будет возвращать Class, представляющий класс String, другими словами, это эквивалентно выражению String.class.

Затем неясно, почему вы передаете объект Class на get метод Field. Предполагается, что метод get читает поле, и поскольку это поле, объявленное в классе SocketTest, для него требуется экземпляр SocketTest, а не пример Class, ни SocketTest.class, ни String.class. Если, однако, поле static, вам ничего не нужно пропускать, вы можете просто использовать socketField.get(null).

Как правило, вы должны переосмыслить свой дизайн. Если класс SocketTest инкапсулирует экземпляр Socket, то до InputStream, при необходимости, InputStream, если , если, это не считается победой инкапсуляции, в противном случае вы не должны пытаться противодействовать этому дизайнерскому решению с помощью Reflection.

+0

Спасибо, Холгер. Я понимаю, что в этом случае мне нужно передать экземпляр SocketTest в качестве параметра для получения метода. Поскольку SocketTest.class не будет возвращать экземпляр, есть ли способ получить существующий экземпляр (если в классе SocketTest не могут быть внесены изменения). –

+0

Нет такой возможности поиска существующего экземпляра. Даже не понятно, почему вы предполагаете, что существует существующий экземпляр вообще. Как насчет создания экземпляра? – Holger

+0

Во время выполнения SocketTest создаст соединение сокета на определенном порту. Поэтому я думал, что для получения входного потока этого сокета мне понадобится существующий экземпляр SocketTest. С новым экземпляром я получаю новое соединение сокетов (не там, где будет подключен пользователь). –

Смежные вопросы