[Java] Wrapper qui exécute la méthode privée d'un objet depuis l'extérieur de la classe

[Java] Wrapper qui exécute la méthode privée d'un objet depuis l'extérieur de la classe

Lors de l'écriture de tests, j'accède parfois aux méthodes privées de l'objet, J'ai créé une fonction wrapper simple car je ne peux pas le faire en appuyant directement sur la réflexion à chaque fois.


class Main {

    /**
     *Exécuter la méthode privée de l'objet
     *
     * @param target Instance de l'objet cible
     * @nom de paramètre nom de méthode
     * @param <T>Type d'objet cible
     * @jette une exception d'exception lors de l'exécution de la méthode
     */
    public static <T> void invokeMethod(T target, String name) throws Exception {
        final Method method = target.getClass().getDeclaredMethod(name);
        method.setAccessible(true);
        method.invoke(target);
    }

    /**
     *Exécuter la méthode privée de l'objet
     *
     * @param target Instance de l'objet cible
     * @nom de paramètre nom de méthode
     * @param parameterValues Liste des arguments
     * @param <T>Type d'objet cible
     * @jette une exception d'exception lors de l'exécution de la méthode
     */
    public static <T> void invokeMethod(T target, String name, List<?> parameterValues) throws Exception {
        //Obtenez un tableau de types d'arguments
        final Class<?>[] parameterTypes = new Class[parameterValues.size()];
        parameterValues.stream().map(Object::getClass).collect(Collectors.toList()).toArray(parameterTypes);

        final Method method = target.getClass().getDeclaredMethod(name, parameterTypes);
        method.setAccessible(true);
        method.invoke(target, parameterValues.toArray());
    }

    /**
     *Exécuter la méthode privée de l'objet
     *
     * @param target Instance de l'objet cible
     * @nom de paramètre nom de méthode
     * @param parameterValues Liste des arguments
     * @param resultType Instance de classe de l'objet résultat
     * @param <T>Type d'objet cible
     * @param <U>Type de retour
     * @valeur de retour de la méthode de retour
     * @jette une exception d'exception lors de l'exécution de la méthode
     */
    public static <T, U> U invokeMethod(T target, String name, List<?> parameterValues, Class<U> resultType) throws Exception {
        //Obtenez un tableau de types d'arguments
        final Class<?>[] parameterTypes = new Class[parameterValues.size()];
        parameterValues.stream().map(Object::getClass).collect(Collectors.toList()).toArray(parameterTypes);

        final Method method = target.getClass().getDeclaredMethod(name, parameterTypes);
        method.setAccessible(true);
        return resultType.cast(method.invoke(target, parameterValues.toArray()));
    }

    static class PrivateMethodTest {
        private void sayHelloWorld() {
            System.out.println(makeHelloMessage("world!"));
        }
        private void sayHello(String message) {
            System.out.println(makeHelloMessage(message));
        }
        private String makeHelloMessage(String message) {
            return "Hello, " + message;
        }
    }

    public static void main(String[] args) throws Exception {
        final PrivateMethodTest target = new PrivateMethodTest();

        invokeMethod(target, "sayHelloWorld");

        final List<Object> params = new ArrayList<>();
        params.add("world!");

        invokeMethod(target, "sayHello", params);

        final String message = invokeMethod(target, "makeHelloMessage", params, String.class);
        System.out.println(message);
    }
}

Recommended Posts

[Java] Wrapper qui exécute la méthode privée d'un objet depuis l'extérieur de la classe
[Java] Précautions lors de la création d'un processus qui appelle une méthode de classe abstraite utilisant DI à partir d'une classe enfant
[Java] Classe d'objets
Appel de méthode Java depuis RPG (appel de méthode dans sa propre classe)
Java à partir du débutant, déclaration de classe / génération d'objet
Nom de la méthode de la méthode de fabrique statique apprise à partir de Java 8
Incrémenté du troisième argument de la méthode iterate de la classe Stream ajoutée depuis Java9
Programmation Java (méthode de classe)
Java Méthode à usage général qui récupère uniquement les différences entre les propriétés des objets de la même classe
J'ai créé un Wrapper qui appelle KNP depuis Java
[Java] Opération objet de la classe ArrayList (AOJ ④ Inversion de séquence de nombres)
[Java] Référence de classe de wrapper Integer
[Java] Comparateur de la classe Collection
Résumé de la classe Java Math
Avantages de la méthode statique Java
[Java débutant] Conversion d'une chaîne de caractères en valeur numérique - Quelle est la méthode parseInt de la classe Integer? ~
[Java] Les restrictions d'accès aux champs privés ne sont pas par objet mais par classe
[Java] Méthode de liste qui détermine si un objet spécifique est inclus
[Java] Syntaxe orientée objet - Méthode / argument de classe
Diverses méthodes de la classe Java String
Comment tester une méthode privée et la simuler partiellement en Java
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java