访问android类的受保护变量

时间:2014-08-30 05:44:23

标签: android launcher

最近我编写了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文件,希望它能访问这些新文件,我是否必须更改这些文件?我只是不知道。

由于

3 个答案:

答案 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.jarframework2.jar与您的代码相关联才能访问隐藏的API。但是,您的应用程序也可能在运行时引发Security Exception

正如您提供的链接所示,您必须构建源以获取这些jar。那些受保护的变量必须来自基类。如果我正确理解你的问题,基类可能来自框架罐。