2016-10-03 4 views
0

리플렉션을 사용하여 필드 값을 얻는 데 도움이 필요합니다. 서버 소켓 구현 클래스 (SocketTest.class)가 있으며 소켓 기능이 정상적으로 작동합니다. 이 클래스의 소켓 필드를 잡으려고 노력 중이며 getInputStream() 메서드를 호출하여 입력을 허용하려고합니다. 다음 코드는 나에게 IllegalArgumentException주고있다 - 즉 클래스 String를 나타내는 Class 반환하는의 String 예를 "SocketTest"getClass()를 호출합니다 표현 "SocketTest".getClass()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

을 표현 String.class에 해당합니다.

Class 개체를 get 메서드로 Field으로 전달하는 이유가 명확하지 않습니다. get 메서드는 필드를 읽어야하며이 필드는 SocketTest 클래스에서 선언 된 필드이기 때문에 인스턴스가 아닌 SocketTest 인스턴스를 필요로하며 SocketTest.class이나 String.class이 아닙니다. 그러나 입력란이 static 인 경우 아무 것도 전달하지 않아도됩니다. socketField.get(null) 만 사용할 수 있습니다.

일반적으로 디자인을 재고해야합니다. SocketTest 클래스가 Socket 인스턴스를 캡슐화하는 경우 SocketTestInputStream이고, 필요한 경우 인 경우 인 경우 캡슐화를 무력화하는 것으로 간주되지 않습니다. 그렇지 않으면 리플렉션을 사용하여이 디자인 결정을 중화하려고 시도하면 안됩니다.

+0

감사합니다. 이 경우 메서드를 가져 오기 위해 SocketTest의 인스턴스를 매개 변수로 전달해야한다는 것을 알고 있습니다. SocketTest.class는 인스턴스를 반환하지 않으므로 기존 인스턴스를 가져올 수있는 방법이 있습니다 (SocketTest 클래스에서 변경을 수행 할 수 없다고 간주). –

+0

"기존 인스턴스 검색"기능은 없습니다. 왜 당신이 추측하는지, 심지어는 기존의 인스턴스가 전혀없는 것은 분명하지 않습니다. 인스턴스 생성은 어떻습니까? – Holger

+0

런타임시 SocketTest는 특정 포트에서 소켓 연결을 만듭니다. 그래서 그 소켓의 입력 스트림을 얻으려면 SocketTest의 기존 인스턴스가 필요하다고 생각했습니다. 새로운 인스턴스를 사용하면 새로운 소켓 연결 (사용자가 연결되는 곳이 아닌)을 얻을 수 있습니다. –

관련 문제