如何访问一个对象的私有变量
为什么要访问一个对象的私有变量呢?在单元测试时可能要查看私有变量是否被正确赋值,也有可能单元测试时要用到一个对象让它的一个私有变量为特定值,但又没有set方法。
私有变量不能通过对象直接访问,但是并不是说一个类的私有变量就不能访问。有一个绝招就是利用反射机制。
/**
* Sets the id of doc to be docid by reflection.
*
* @param doc the WordSource to set id
* @param docid the document id to be set
*/
private void setDocId(WordSource doc, WordSourceId docid) throws Exception {
Field f = doc.getClass().getDeclaredField(”sourceId”);
f.setAccessible(true);
f.set(doc, docid);
f.setAccessible(false);
}
WordSource 有一个私有变量sourceId。因为WordSource 没有setSourceId方法,只有通过这种方式来得到一个特定sourceId 的WordSource 用于测试。