如何使用反射在私有字段上运行方法?

时间:2013-08-27 19:26:07

标签: java reflection

我有一个资源类

public class SecureResource {

    private HttpServletRequest request;

    // some more things here
}

我想使用java反射来运行request.getHeader('X-AUTH')

我尝试了什么?

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

1 个答案:

答案 0 :(得分:10)

您当前正在尝试获取字段,就像它是java.lang.String实例上的字段一样。大概你已经有了SecureResource的实例,所以你想要打电话:

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

(其中resource是对SecureResource的相关实例的引用。)

那就是说,即使你已经开始工作,我也会强烈劝阻它,如果可能的话。你的代码不适用于有严格安全管理器的场景,面对实现的变化会很脆弱,而且通常建议你尝试做一些没有设计类的东西。