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为"变量名"的类对象。

posted on 2013-03-08 11:48  snowdrop  阅读(439)  评论(0编辑  收藏  举报