如何存取一個 class 的 protected / private member,
在加了好幾個 getter method 後,
參照下面連結後,
http://stackoverflow.com/questions/1771744/accessing-private-variables-in-java-via-reflection
最終整理出一個目前較適合自己的寫法。(兼顧彈性與安全性)
這樣每一個需要測的 class 只需要加一個
getInstanceField() 就可以了。
public class SomeActivity extends Activity {
protected ListView mListView;
public static Object getInstanceField(Object instance, String fieldName) {
// Disable this function if it is a commericial build
if ( true == COMMERICIAL_BUILD ) {
return null;
}
Object obj = null;
try {
Field field = SomeClass.class.getDeclaredField(fieldName);
obj = field.get(instance);
} catch (Exception e) {
e.printStackTrace();
}
return obj;
}
}
至於在 Unit Test 那兒,就可以寫成
SomeActivity activity = getActivity(); ListView listView = (ListView) SomeActivity.getInstanceField(
activity
, "
mListView
");
還蠻方便。
P.S. 這方法似乎沒辦法捉到 superclass 的 member。需要在 superclass 加同樣的一段code
沒有留言:
張貼留言