2013-08-27 3 views
1

나는 자바 반사를 사용하여 request.getHeader('X-AUTH') 실행 TUN 싶습니다리플렉션을 사용하여 비공개 필드에서 메소드를 실행하는 방법은 무엇입니까?

public class SecureResource { 

    private HttpServletRequest request; 

    // some more things here 
} 

같은 자원 클래스가?

나는 무엇을 시도 했습니까?

Field f = response.getResourceClass().getDeclaredField("request"); 
f.setAccessible(true); 
f.get("X-AUTH"); 

나는 내가 무엇을 놓치고 있는지

java.lang.IllegalArgumentException: Can not set javax.servlet.http.HttpServletRequest field com.sn.bb.service.SecureResource.request to java.lang.String 

를 얻을? f에서 request.getHeader('X-AUTH')을 어떻게 실행합니까?

+0

나는 그와 같은 인스턴스 메소드가 없다 : 'java.lang.reflect.Field.getHeader'' – daydreamer

답변

9

현재 필드를 가져 오는 중입니다. 필드는 마치 java.lang.String의 필드와 같습니다. 아마도 당신은 이미 SecureResource의 인스턴스를 가지고, 그래서 당신은 전화를 할 것입니다 : (. resourceSecureResource의 관련 인스턴스에 대한 참조 인 경우)

Field f = response.getResourceClass().getDeclaredField("request"); 
f.setAccessible(true); 
HttpServletRequest request = (HttpServletRequest) f.get(resource); 
String auth = request.getHeader("X-AUTH"); 

는 말했다, 당신은했습니다 경우에도 가능하다면 나는 그것을 강력하게 억제 할 것입니다. 엄격한 보안 관리자가있는 시나리오에서는 코드가 작동하지 않을 것입니다. 구현 변경에 직면하면 부서지기 쉽고, 일반적으로 클래스가 설계되지 않은 작업을하려는 것입니다.

+0

Jon,'HttpServletRequest request = (HttpServletRequest) f.get (response. 012RootClass() .newInstance()); – daydreamer

+0

@daydreamer : 왜 'newInstance'를 호출할까요? 필드에서 얻으려면 먼저 'SecureResource' 인스턴스가 있어야합니다. 한 발 뒤로 물러나서 정확하게하려는 것을 시도해보십시오 - 필드 *가 비공개가 아닌지 상상해보십시오 - 그러면 어떻게 할 것입니까? –

관련 문제