Java 如何确定方法是否已被重写?

Java 如何确定方法是否已被重写?,java,Java,考虑以下场景: 我正在开发一个框架,该框架允许用户对框架提供的特定抽象类进行子类化,从而允许用户将自己的功能插入到应用程序流中 例如,像这样的类: public class MyAbstractClass { protected String step1(String input) { // default implementation } public final void process(MyObject objct) { // so

考虑以下场景:

我正在开发一个框架,该框架允许用户对框架提供的特定抽象类进行子类化,从而允许用户将自己的功能插入到应用程序流中

例如,像这样的类:

public class MyAbstractClass {
    protected String step1(String input) {
        // default implementation
    }

    public final void process(MyObject objct) {
        // some steps
        String someData = step1(object.getInput());
        // some more steps
    }
}
现在,在新版本的框架中,我想将step1方法更改为使用某个对象(可以转换为当前step1方法的参数)作为参数。但是,我不想破坏已经扩展了这个类的用户的代码

我目前正计划这样做:

public class MyAbstractClass {

    private boolean isOldStep1Overriden = true;

    protected String step1(MyObject input) {
        String oldValue = step1(input.getInput());
        if (isOldStep1Overriden) {
            // the method has been overriden - some logic here to handle this (assume this logic is known)
        } else {
            // the method has not been overriden - ignore the old value and carry out the new default processing
        }
    }

    @Deprecated
    protected String step1(String input) {
        // default implementation
        isOldStep1Overriden = false;
    }

    public final void process(MyObject objct) {
        // some steps
        String someData = step1(object);
        // some more steps
    }
}
有没有其他方法来实现这样的用例

以下选项也处于搁置状态:

  • 为新实现创建一个新的抽象类——这将防止现有用户在不修改代码的情况下获得新功能
  • 使用反射-如果可能的话,我宁愿不使用反射
编辑:一些更相关的背景信息:


所讨论的框架实际上是一个部署到共享位置的应用程序,该框架的用户(开发人员)提交要在其中安装的扩展。因此,应用程序本身可以升级,而无需扩展的开发人员对其代码进行任何更改。以一个类似的系统为例,考虑Firefox和它的附加组件——它们都是由单独的团队开发的,并且Firefox可以在没有AdDon开发者的知识的情况下被更新。

参见标准应用程序,抽象类不知道(NY)子类,你会怎么做?只要改变它,如果这是需要发生的,你就不会破坏任何东西。毕竟,用户必须更新到新版本才能获得此更改。@Stultuske您能详细介绍一下吗?你说的“改变它”是什么意思?如果OP只是更改它,那么使用该类的现有代码将不再编译。甚至更糟糕的是(如果现有代码不使用
@Override
),它将编译,但不会执行以前的操作。@DodgyCodeException只有在现有代码将依赖项更改为新版本时,它才会中断。的确,这是一个风险,但在开始迁移之前,他们不会意识到(或至少无法预见)这一风险。如果现有代码没有将其标记为重写,这确实是一个风险,但它应该提示他们学习干净的编码。无论哪种方式:“在不更改代码的情况下获得新功能”,这都是荒谬的。他们会(至少会)创建一个新类,以提供抽象类的任何实现。我已经在问题中添加了一些附加信息-基本上,应用程序可以在子类的开发人员不更新其代码的情况下进行更新。您的方法将不起作用,我想如果不进行反思,您将无法做到这一点。如果有人从覆盖方法调用
super.step1(…)
,该怎么办?