如何通过反射区分类中的方法是重写(override)还是普通方法

275 阅读1分钟

想要通过反射,获取重写了抽象父类的子类中的方法时,将子类与父类的方法名、参数及返回类型进行一一比对。因为子类不能定义与父类方法名、参数及返回类型相同方法

/** 获去子类重写超类的方法list */
public static List<Method> isOverride(Class b) {
    Method[] bfs = b.getClass().getDeclaredMethods();
    Method[] afs = b.getClass().getSuperclass().getDeclaredMethods();
    List<Method> methodsOverride = new ArrayList<Method>();
    for (Method bm : bfs) {
        for (Method am : afs) {
            if (bm.getName().equals(am.getName()) &&
                    bm.getReturnType().equals(am.getReturnType())) {
                Class[] bc = bm.getParameterTypes();
                Class[] ac = am.getParameterTypes();
                if (bc.length == ac.length) {
                    boolean isEqual = true;
                    for (int i = 0; i < bc.length; i++) {
                        if (!bc[i].equals(ac[i])) {
                            isEqual = false;
                            break;
                        }
                    }
                    if (isEqual) {
                        methodsOverride.add(bm);
                    }
                }
            }
        }
    }
    return methodsOverride;
}