2013-08-27 2 views
1

У меня есть класс ресурсов какКак запустить метод на частном поле, используя отражение?

public class SecureResource { 

    private HttpServletRequest request; 

    // some more things here 
} 

Я хотел бы TUN запустить request.getHeader('X-AUTH') с помощью Java Reflection?

Что я пробовал?

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 

Что, что я не хватает? Как я могу запустить request.getHeader('X-AUTH') на f?

+0

Я пробовал это и получил 'Нет такой метод экземпляра: 'java.lang.reflect.Field.getHeader'' – daydreamer

ответ

9

Вы пытаетесь сделать поле, как если бы оно было полем на примере java.lang.String. Вероятно, у вас уже есть экземпляр SecureResource, поэтому вы хотите позвонить: (. Где resource является ссылкой на соответствующий экземпляр SecureResource)

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

Тем не менее, даже если вы имеете он работал, я бы сильно отговорил, если это вообще возможно. Ваш код не будет работать в сценариях, где есть строгий диспетчер безопасности, он будет хрупким перед лицом изменения в реализации, и обычно он предполагает, что вы пытаетесь сделать что-то, для которого класс не был разработан.

+0

Jon, я вижу' NullPointerException', когда я делаю запрос HttpServletRequest = (HttpServletRequest) f.get (ответ. getResourceClass(). newInstance()); ' – daydreamer

+0

@daydreamer: Ну, почему вы бы назвали' newInstance'? Для начала вам нужно иметь экземпляр «SecureResource», чтобы попасть в поле. Сделайте шаг назад и попытайтесь точно определить, что вы пытаетесь сделать - представьте, если поле * не было * частным - что бы вы сделали? –

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