确定方法是否在运行时覆盖另一个方法
我想知道是否有任何方法可以确定给定的java.lang.Method
对象所代表的方法是否会覆盖另一个java.lang.Method
对象所代表的另一个方法?
我正在研究Stronlgy类型的javascript ,我需要能够知道一个方法是否覆盖了另一个方法,以便能够将它们重命名为更短的名称。
在这种情况下,我正在谈论覆盖的扩展定义,由@Override
注释支持,其中包括接口和抽象类方法的实现。
我对任何涉及直接reflection或使用任何已经执行此操作的库的解决方案感到满意。
您只需交叉检查方法名称和签名即可。
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时轻松修改方法的名称。