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

通过反射或其他方式覆盖Java final方法?

梁楷
2023-03-14
问题内容

尝试编写测试用例时会出现此问题。Foo是框架库中的类,我没有源访问权限。

public class Foo{
  public final Object getX(){
  ...
  }
}

我的申请将

public class Bar extends Foo{
  public int process(){
    Object value = getX();
    ...
  }
}

由于其他依赖关系,我无法创建Foo对象,因此单元测试用例无法初始化。BarTest会抛出一个null指针,因为value为null。

public class BarTest extends TestCase{
  public testProcess(){
    Bar bar = new Bar();        
    int result = bar.process();
    ...
  }
}

有没有一种方法可以使用反射API将getX()设置为非最终值?或者我应该如何进行测试


问题答案:

您可以创建另一个可以在测试中覆盖的方法:

public class Bar extends Foo {
  protected Object doGetX() {
    return getX();
  }
  public int process(){
    Object value = doGetX();
    ...
  }
}

然后,您可以在BarTest中覆盖doGetX。



 类似资料:
  • 问题内容: 在 Java中 ,是否可以覆盖使用创建的类中的方法?例如,说我有以下课程: 在一个类中,我想直接创建它并重写其方法,如下所示: 有没有办法以同样的方式使用反射来覆盖方法?也许是这样的吗?: 如果没有,是否还有其他方法可以这样做,或者可以使用外部库吗?我正在寻找将侦听器添加到setter方法以更改绑定值的方法。 问题答案: 不,用您的例子是不可能的。 在您的示例中,Java编译器将创建两

  • 我想在我的android项目中自动转换视图。所以,我想重写 方法 方法但是java编译不允许这样做,但是重写的方法不会与父方法冲突,并且总是返回视图对象或其子对象。我发现了一些信息,java不允许用泛型方法重写非泛型方法,但我找不到解释。 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#FAQ8

  • 问题内容: Java不允许覆盖静态方法,但是, 在这里没有覆盖吗? 问题答案: 这是“隐藏”,而不是“覆盖”。要看到这一点,请将方法更改为以下内容: 这应该打印: 如果正在进行真正的覆盖,那么您会看到: 通常认为使用实例类型来调用静态方法是一种不好的方式,就像您正在做的那样,因为很容易想到您正在调用实例方法,并且容易误以为重写正在发生。Java样式检查器/代码审核工具通常会将其标记为样式错误/潜在

  • 要 动态获取一个对象方法的信息,首先需要通过下列方法之一创建一个 类型的对象或者数组。 getMethods() getMethods(String name,Class<?> …parameterTypes) getDeclaredMethods() getDeclaredMethods(String name,Class<?>...parameterTypes) 如果是访问指定的构造方法,需要

  • 问题内容: 我正在尝试使用当前位置在android中提交用户注册表格。我是android和java开发的新手。当我尝试在我的名称值对代码中访问onLocationChanged方法的myLat和myLan时,无法同时找到这两个变量。如何访问我的名称/值对代码中的两个变量。 问题答案: 您可能应该研究范围和成员变量。问题是,您不能在一个方法中声明一件事,然后尝试从另一方法访问它。 因此,我们将该事物

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