web-dev-qa-db-fra.com

Comment obtenir la valeur d'initialisation pour une référence de classe Java

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.

12
Lukas Eder

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();
19
Holger

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
7
awesoon

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

2
Lukas Eder

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();
0
Selaron