最近我编写了adw-launcher的源代码,这个项目的一些类使用了android类的受保护变量。 以下是代码段:
@Override
protected boolean setFrame(int left, int top, int right, int bottom) {
if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) {
mBackgroundSizeChanged = true;
}
return super.setFrame(left, top, right, bottom);
}
mLeft,mRight都受到保护。
如何解决这个问题? 我完全是菜鸟,需要你的指导。
我浏览了这个链接:How do I build the Android SDK with hidden and internal APIs available?
如果我更换新的jar文件,希望它能访问这些新文件,我是否必须更改这些文件?我只是不知道。
由于
答案 0 :(得分:0)
您可以使用强大(且危险)的Java反射API,风险自负!
try {
Field field = TargetClass.class.getDeclaredField(fieldName);
field.setAccessible(true);
result = field.get(targetObject);
field.setAccessible(false);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
获取结果int
:
int result = field.getInt(targetObject);
答案 1 :(得分:0)
您无法访问其软件包之外的protected
成员 - 这是Java的设计。
您可以使用Java反射访问它,但这是不可取的。
Field[] f = ClassName.getClass().getDeclaredFields();
然后,只需f[i].setAccessible(true)
让自己从中读取。但除非确实需要,否则这绝对不可取。
答案 2 :(得分:0)
Android SDK隐藏类仅适用于框架级应用/代码。您需要将framework.jar
和framework2.jar
与您的代码相关联才能访问隐藏的API。但是,您的应用程序也可能在运行时引发Security Exception
。
正如您提供的链接所示,您必须构建源以获取这些jar。那些受保护的变量必须来自基类。如果我正确理解你的问题,基类可能来自框架罐。