如何覆盖java类中的单个方法

时间:2011-12-23 12:06:23

标签: java android methods

我对java开发相当新,并且更好地修改现有的Android类。我想更改Android中Notification.Builder类中的一些方法(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Notification.java)。

具体来说,我想要更改getNotification(),但在新实现中,我需要访问私有字段(例如mWhenmSmallIcon)。

我试图扩展该类,但后来我无权访问超类的私有字段(即mWhenmSmallIcon)。

更改方法的最佳做法是,复制源代码并对其进行修改?

更新: 更确切地说:如何更改现有类中的单个方法并仍然可以访问现有类的私有字段?

感谢所有回复!

4 个答案:

答案 0 :(得分:2)

您只需在覆盖方法中调用super.getNotification()并在返回之前修改生成的对象。

答案 1 :(得分:0)

私有(内部)类,方法或字段仅在声明它的类中引用。 但您也可以声明自己的变量并按照自己的意愿使用它

答案 2 :(得分:0)

最佳做法是不覆盖方法(来自未被设计为被覆盖的第三方类),而是创建一个包装第三方类的新类/方法。谷歌为这些:“脆弱的基类问题”,“组成而不是继承”。

答案 3 :(得分:0)

  

我试图扩展该类,但后来我无权访问超类的私有字段(即mWhen,mSmallIcon)。

在您要扩展的特定类中,设置这些字段值的方法数量有限。您可以覆盖这些方法,以保留子类中新字段中值的副本,然后可以在覆盖getNotification()时使用。

这是一种破解,对于更复杂的类是不可行的。

另一个黑客是使用反射并在字段对象上调用setAccessible(true)。根据安全限制,这也可能无法使用。

如果您确切地说出了您想要做出的改变,可能会有更好的方法。