【问题标题】:Override public final method in Java (reflection?!)覆盖 Java 中的公共 final 方法(反射?!)
【发布时间】:2013-03-22 21:36:28
【问题描述】:

当我尝试为 Android 项目创建自定义 LayoutAnimationController 时,我遇到了问题。它有方法

public final Animation getAnimationForView(View v)

对于我的自定义 LayoutAnimationController,我需要重写这个方法,因为每个视图都应该获得一个“独特”的动画。 是否可以使用反射或类似技术覆盖公共 final 方法,或者您有其他想法?

我知道在override java final methods via reflection or other means? 中讨论过类似的问题,但那里出现的“解决方案”非常针对用户的问题,并没有完全回答覆盖最终方法的问题。

【问题讨论】:

  • 为什么需要在反射中覆盖它?只需有一个实现接口的类,并将动画的唯一性建立在接口的具体实现之外的其他东西上
  • 你可以用 java.util.Proxy 类做你想做的事,但我不确定你是否能说服它做你想做的事。
  • 不幸的是,没有可以实现的 LayoutAnimationController 接口 - LayoutAnimationController 是基类。如果尝试使用 java.reflect.Proxy,但我想我并没有真正理解我必须做什么才能让它工作。

标签: java android reflection overriding final


【解决方案1】:

看起来LayoutAnimationController 不适合这样使用。

如果您能够使用您想要的功能覆盖getAnimationForView(View v)LayoutAnimationController 的大多数方法/构造函数将毫无意义,因为创建此类是为了在多个视图上使用单个动画(具有不同的延迟)。

也许最好查看源代码并根据这些信息创建您自己的动画控制器。

【讨论】:

  • 实际上,如果您查看代码,您可以看到 LayoutAnimationController 正在使用mAnimation.clone() - 所以任何视图都有它自己的动画实例。因此,我有点恼火这种方法是公开的。确实,延迟是由您在构造函数中传递的一个动画计算的,但这对我的用例来说不是问题,因为任何动画都可能具有相同的持续时间。复制类的问题在于,它有很多包可见性依赖项。
【解决方案2】:

一个老问题,但我仍然觉得我应该回答,因为使用 LayoutAnimationController 似乎没有可能的解决方案。

我最终覆盖了AnimationSet,并将LayoutAnimationController 功能移至该类。当然,还有我的自定义代码。

最后,我不得不吐槽一下:这几乎不是我第一次在 Google 框架中以您喜欢的方式代码遇到某种私有/最终/访问被拒绝的情况。如果他们给我们程序员带来困难,他们似乎觉得很有趣。我知道Transformation 只有Animations 是为了表演而存在的,但有时我们只是需要一些不同的东西,而通过这种幼稚的方式来禁用我们是非常荒谬的。 /咆哮

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 2011-08-24
    • 2023-04-10
    • 2013-12-20
    • 1970-01-01
    相关资源
    最近更新 更多