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