2011-12-23 57 views
1

我对java开发和创建者来说是相当新的,我可以如何修改现有的Android类。我想更改Android中Notification.Builder类的一些方法(https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/Notification.java)。如何覆盖java类中的单个方法

特别是我想更改getNotification(),但在新的实现中,我需要访问专用字段(例如,mWhen,mSmallIcon)。

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

改变方法的最佳做法是,复制源代码并修改它?

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

感谢您的回复!

+0

你为什么要改变它? – 2011-12-23 12:10:46

+0

我有一个动态图标(显示温度),我需要一个内容和股票自定义布局。我知道可以通过给定一个自定义的contentView和tickerView来完成,但我更愿意制作一个自定义的构建器。也许它更好地通过意见... – 2011-12-23 12:17:07

回答

2

你可以简单地在你的覆盖方法中调用super.getNotification()并在返回它之前修改结果对象。

+0

谢谢,但我仍然无法访问Notification.Builder的私人领域(例如,mWhen) – 2011-12-23 12:18:16

+0

@tibnor:是的 - 但你不需要,因为他们仅用于设置通知的公共字段。 – 2011-12-23 12:22:12

0

私有(内部)类,方法或字段仅在声明它的类内引用。 但是你也可以声明你自己的变量并且随你所愿

0

最佳实践不是覆盖方法(来自不是被设计为被覆盖的第三方类),而是创建一个新的包装第三方类的类/方法。 Google对于这些:“脆弱的基类问题”,“构成超越继承”。

0

我试图扩展类,但是我没有访问超类的私有字段(即mWhen,mSmallIcon)。

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

这是一种黑客行为,对于更复杂的类来说是不可行的。

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

如果您确切地说明了您正在尝试进行的更改,那么可能会有更好的方法。