1.比如在Camera的test case里面想获取Gallery2中的某个抽象类类的一个protected变量。此抽象类在Camera 中实现。
想访问Gallery2中的surfaceTextureScreenNail中的mRequestCount变量。
protected int mRequestCount = 0;
...在Camera中的CameraScreenNail.java extends surfaceTextureScreenNail
直接访问变量mRequestcount = ...
进行赋值引用。
即:A包里面有个abstract B类,C包里面有个D extends B 类,和E类,想在E里面访问B类的protected变量。
(1) B.class.getDelaredField("string");
//string为你想访问的那个变量,这里一定要用B,不能用D,也就是一定要用定义这个变量的那个类,而非其子类。
//这样返回一个Field类型的变量
Field fid = B.class.getDelaredField("string");
(2) fid.setAccessible(true);
(3) fid.get(object);
此object可以用子类D的object,此中:
先在Camera.java中获取CameraScreenNail(D) object,然后通过传入此object得到mRequestCount变量。而CameraScreenNail在ActivityBase中定义。
完整代码:
Field fd = ActivityBase.class.getDeclaredField("mCameraScreenNail");
fd.setAccessible(true);
CameraScreenNail csn = (CameraScreenNail)fd.get(mActivity);
其中mActivity是Camera object。
上面通过Camera把定义在ActivityBase中的mCameraScreenNail拿到了,下面再通过
CameraScreenNail拿到其父类的变量mRequestCount;
Field fid = SurfaceTextureScreenNail.class.getDeclaredField("mRequestCount");
fid.setAccessible(true);
int fpsJisuan = (Intefer)fid.get(csn);
这样就可以了。
总结:通过XX.class.getDeclaredField("变量名")得到这个变量名的Field 类型 的fd;
再setAccessible(true);
最后再fd.get(object);
object为"变量名"的类对象。