【问题标题】:Java how to extend a hidden classJava如何扩展隐藏类
【发布时间】:2016-07-26 10:16:41
【问题描述】:

我需要重写一个隐藏类(用@hide 标记)的方法,该方法只在其包中可见。有什么办法可以扩展吗?

更具体地说,我需要覆盖 android.widget.EditorgetNextCursorOffset(),因为该方法不适用于 ReplacementSpan

【问题讨论】:

  • 为什么不用自己的装饰器和Editor的所有方法,只用自己的getNextCursorOffset?
  • @SMA 你的意思是克隆Editor.java?这太疯狂了,因为它有 5K+ 行代码。
  • 不克隆。您将在新类中编写编辑器,并将其他方法的调用委托给编辑器实例,而对于 getNextCursorOffset,您将实现自己的逻辑。
  • @SMA,如果 getNextCursorOffset() 受包保护,这将不起作用,它对不同包中的代码不可见。如果该方法受到保护,将会奏效。
  • @SMA 我明白了。但这也不容易。这不是直接调用,整个逻辑很复杂。许多私有成员需要修改,它们本身也无法访问。

标签: java android


【解决方案1】:

您可以在项目中定义相同的包android.widget。然后你可以扩展它:

public class ProjectSpecificEditor extends Editor {
    // constructors et all
    public int getNextCursorOffset() {
        //...
    }

}

但请注意,不鼓励这样做。 IE。框架的下一个版本可能会更改一些类/方法签名。那你只能责怪自己了。

【讨论】:

  • 对不起,我没有测试它。即使我定义了相同的包,Android Studio 仍然无法解析Editor。有什么需要配置的吗?
  • 一个好的交叉检查是你是否可以从命令行编译它。
【解决方案2】:

我的想法来自ryan gordon

基本上,所有标有@hide 的内容都会在编译框架时被移除,Android Studio 使用该框架来编译您的代码。你可以在\AppData\Local\Android\Sdk\platforms\android-xx\android.jar 中解决这个问题。 ryan 建议,要么自己编译 android 框架,不用 @hide,要么从 root 手机中获取已经编译好的框架(因为 @hide 不会影响实际手机中使用的代码)

在我看来,一个更简单的替代方法是简单地从android.jar 中提取.class 文件,使用任何Java 字节码编辑器,然后添加缺少的方法。然后替换android.jar中的文件。

但是,正如 Tamas Rev 所提到的,标有 @hide 的方法永远不会被访问,因此不能保证它存在于旧版本中,或者行为在版本之间是一致的,或者它会存在于未来!

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-23
    • 2019-02-14
    相关资源
    最近更新 更多