Java如何扩展隐藏类

时间:2016-07-26 10:16:42

标签: java android

我需要覆盖一个隐藏类(用@hide标记)的方法,该方法只在其包中可见。有没有办法扩展它?

更具体地说,我需要覆盖 android.widget.Editor getNextCursorOffset(),因为该方法与ReplacementSpan的效果不佳。

2 个答案:

答案 0 :(得分:0)

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

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

}

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

答案 1 :(得分:0)

我从ryan gordon那里得到了主意

基本上,标记为@hide的所有内容在编译框架时都会被删除,Android Studio会使用该框架来编译您的代码。您可以在\AppData\Local\Android\Sdk\platforms\android-xx\android.jar中对其进行罚款。 ryan提出的建议是要么自己编译没有@hide的android框架,要么从有根电话中获取已经编译的框架(因为@hide不会影响实际电话中使用的代码)

我认为,更简单的选择是从.class中提取android.jar文件,使用任何Java字节码编辑器,然后添加缺少的方法。然后替换android.jar中的文件。

但是,就像Tamas Rev所提到的那样,标记为@hide的方法永远都不会被访问,因此不能保证它存在于较旧的版本中,或者行为在各个版本之间是一致的,或者将来存在!