当前位置: 首页 > 面试题库 >

我可以覆盖隐藏的(但公共的)方法并调用其超级方法吗?

林劲
2023-03-14
问题内容

为了解决Android WebView的怪癖,我需要重写一个非公共api。

该api是隐藏的,但它是公共的:

/**
 * ...
 *
 * @hide pending API council approval
 */
public boolean selectText() {
    ...
}

因此,可以通过在我自己的WebView类中声明它,而不是@Override来覆盖它:

public boolean selectText() {
    ...
}

是否可以从我的重写中调用super方法?通常我可以写:

public boolean selectText() {
    return super.selectText();
}

但是该方法是隐藏的,因此super.selectText()不可用。如果我使用反射:

public boolean selectText() {
    return (Boolean) WebView.class.getMethod("selectText").invoke(this, (Object[]) null);
}

我得到一个无限循环,因为它调用了我的重写方法。

无论如何,有否重写此方法并能够调用super方法?

谢谢!


问题答案:

无论如何,有否重写此方法并能够调用super方法?

不,不幸的是,正如问题“
如何使用Java反射调用超类方法”的答案中所述,您无法使用反射解决此问题。



 类似资料:
  • 问题内容: 我希望当子类覆盖父类中的方法时,在该子方法中调用。 有什么办法在编译时检查吗? 如果没有,发生这种情况时,我将如何抛出运行时异常? 问题答案: 无法直接要求这样做。但是,您可以执行以下操作: 这提供了一个内部接口点,子类可以使用该接口将自定义行为添加到public 方法,同时确保无论子类做什么都始终执行超类行为。

  • 问题内容: 当我用方法覆盖方法时,Java编译器不会抱怨。这里到底发生了什么?由于父方法的可见性较低,它是覆盖还是隐藏父方法? 问题答案: 子类始终可以扩大访问修饰符,因为它仍然是超类的有效替代。从Java规范中有关覆盖和隐藏的需求: 覆盖或隐藏方法的访问修饰符(第6.6节)必须至少提供与覆盖或隐藏方法相同的访问权限,如下所示: 如果覆盖或隐藏方法是公共的,则覆盖或隐藏方法必须是公共的;否则,将发

  • 问题内容: 在UIViewController中,此代码: 给出错误 我正在使用Xcode 8 beta 4,且iOS部署目标是9.0,并且在 如何将上面的代码转换为Swift 3? 问题答案: 像这样: …还有其余的。 一般模式 现在,许多Cocoa方法都是属性,因此您可以将它们实现为重写计算变量。因此,从种子3(或更早)移动到种子4的模式是: 更改为 删除 更改为 之所以可行,是因为计算的变量

  • 问题内容: 我更新到Xcode 8 beta 5,现在在从UIView继承的类上收到以下错误: 有解决方法吗? 问题答案: 请检查最新参考。(您只需在Apple开发者网站的搜索栏中输入“ intrinsicContentSize”,就可以轻松找到它。) 宣言 已成为计算属性,因此您需要以这种方式覆盖它: 或者简单地:

  • 我有一节课: 在正常使用中,该类的行为与您预期的一样。方法和获取并设置复合列表。然而,我使用这个类作为一个对象,在使用JAX-WS构建的web服务中传递。当JAX-WS编译器看到这个类时,它会忽略和访问器,XSD中出现的唯一属性是。 在一天的大部分时间里,我的头撞在墙上,我决定尝试将私有方法的名称改为,突然间一切都如你所料。JAX-WS为属性创建了正确的模式。 似乎正在发生的事情是,JAX-WS看

  • 问题内容: 在子类的对象上,可以使用父类的静态方法,但是当我们在子类中定义相同的方法时,现在子类的对象开始指向子类的方法。这听起来像是覆盖了,但并非如此,因为静态方法可以t覆盖。这是怎么发生的,以及Java的此功能称为什么? 这似乎很重要,但不是.jdk如何管理它?由于我的垃圾平板电脑,我感到抱歉。 问题答案: 由于extends ,(您通过调用创建的)实例将具有所有方法。因此,如果调用的实例,则