2014-08-30 101 views
0

最近我编写了adw-launcher的源代码,该项目的一些类的一些类使用了android类的protected变量。 下面的代码片段:访问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

您可能需要您自担风险使用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); 
0

您不能访问自己的包外protected成员 - 这是在Java的设计。

您可能能够使用Java反射访问它,但这不可取。

Field[] f = ClassName.getClass().getDeclaredFields(); 

然后,只需f[i].setAccessible(true)让你自己读取它们。但是,除非确实需要,否则这绝对不可取。

+0

但是,他们如何编译源代码?对于前者,他们使用了mleft变量来保护视图。我更新了任务。 – viv 2014-08-30 06:01:21

+0

@viv对不起,我只是不确定你在这里问什么。这就是你如何使用反射访问其他类的受保护变量(尽管这是一种相当危险的方式)。你需要知道什么? – Zyerah 2014-08-30 06:02:46

+0

上面的代码片段来自一个扩展TextView仍然eclipse的类,显示错误。 – viv 2014-08-30 09:54:32

0

Android SDK隐藏类仅适用于框架级应用程序/代码。您需要将framework.jarframework2.jar与您的代码链接以访问隐藏的API。但是,然后你的应用程序可能会在运行时产生一个Security Exception

正如你提供的链接建议你将不得不建立源来获得这些罐子。那些受保护的变量必须来自基类。如果我正确理解你的问题,那么基类可能来自框架罐。

+0

你很好地理解我的问题,即使我编译了这些罐子,变量仍然会被保护,那么呢? – viv 2014-08-30 07:00:13

+0

受保护的变量只能由子类访问。您需要从具有这些变量的类继承。 – 2014-08-30 08:53:30