J'ai une référence Class<?>
pour un type arbitraire. Comment obtenir la valeur d'initialisation de ce type? Existe-t-il une méthode de bibliothèque pour cela ou dois-je rouler la mienne, telle que:
Class<?> klass = ...
Object init =
(klass == boolean.class)
? false
: (klass == byte.class)
? (byte) 0
...
: (Object) null;
Le cas d'utilisation est que j'ai une référence Java.lang.reflect.Method
arbitraire, que je souhaite appeler à l'aide de paramètres arbitraires (pour certains tests), qui peuvent ne pas être null
dans le cas où le paramètre est un type primitif. Je dois donc spécifier une valeur de ce type.
Pour le faire sans bibliothèques tierces, vous pouvez créer un tableau de longueur un et lire son premier élément (les deux opérations via Java.lang.reflect.Array
):
Object o = Array.get(Array.newInstance(klass, 1), 0);
À partir de Java 9, vous pouvez également utiliser
Object o = MethodHandles.zero(klass).invoke();
Vous pouvez utiliser Defaults
class à partir de la bibliothèque goyave:
public static void main(String[] args) {
System.out.println(Defaults.defaultValue(boolean.class));
System.out.println(Defaults.defaultValue(int.class));
System.out.println(Defaults.defaultValue(String.class));
}
Impressions:
false
0
null
Par souci d'exhaustivité, c'est quelque chose qui, je pense, appartient à une API de réflexion. Je l'ai donc ajouté à jOOR à # 68 .
Object init = Reflect.initValue(klass);
Notamment, Guava a un outil similaire et il existe des utilitaires JDK qui peuvent le faire aussi
Pour vérifier si un paramètre d'une méthode est primitif, appelez isPrimitive();
sur le type de paramètre:
Method m = ...;
// to test the first parameter only:
m.getParameterTypes()[0].isPrimitive();