确定一个方法是否在运行时覆盖另一个方法

2022-09-04 04:30:07

我想知道是否有任何方法可以确定给定对象表示的方法是否覆盖了由另一个对象表示的另一个方法?java.lang.Methodjava.lang.Method

我正在研究Stronlgy类型的javascript,我需要能够知道一个方法是否覆盖了另一个方法,以便能够将它们两个重命名为较短的名称。

在本例中,我谈论的是重写的扩展定义,如注释所支持的那样,其中包括接口和抽象类方法的实现。@Override

我很乐意接受任何涉及直接反射或使用已经这样做的库的解决方案。


答案 1

您只需交叉检查方法名称和签名即可。

public static boolean isOverriden(Method parent, Method toCheck) {
    if (parent.getDeclaringClass().isAssignableFrom(toCheck.getDeclaringClass())
            && parent.getName().equals(toCheck.getName())) {
         Class<?>[] params1 = parent.getParameterTypes();
         Class<?>[] params2 = toCheck.getParameterTypes();
         if (params1.length == params2.length) {
             for (int i = 0; i < params1.length; i++) {
                 if (!params1[i].equals(params2[i])) {
                     return false;
                 }
             }
             return true;
         }
    }
    return false;
}

但是,由于您的目标是重命名方法,因此您可能希望使用字节码分析/操作库(如 ASM),在该库中,您可以执行相同的测试,并在方法返回 true 时轻松修改方法的名称。


答案 2

推荐