Question Déterminer si une méthode en remplace une autre à l'exécution


Je me demandais s'il y avait un moyen de déterminer si une méthode représentée par donné java.lang.Method objet remplace d'autres méthodes représentées par un autre java.lang.Method objet?

je travaille sur Javascript typé Stronlgy, et je dois pouvoir savoir si une méthode en remplace une autre pour pouvoir les renommer en un nom plus court.

Dans ce cas, je parle de la définition élargie de la dérogation, soutenue par le @Override annotation, qui inclut l'implémentation de méthodes d'interface et de classe abstraite.

Je serais heureux avec n'importe quelle solution impliquant soit la réflexion directement, ou en utilisant une bibliothèque qui le fait déjà.


12
2017-08-26 20:52


origine


Réponses:


Vous pouvez simplement vérifier les noms et les signatures des méthodes.

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;
}

Cependant, comme votre objectif est de renommer les méthodes, vous pouvez plutôt utiliser une bibliothèque d'analyse / manipulation de bytecode telle que ASM, où vous pouvez effectuer les mêmes tests et modifier facilement les noms des méthodes si la méthode renvoie true.


4
2017-08-26 21:20