it-swarm.com.de

So erhalten Sie den Initialisierungswert für eine Java-Klassenreferenz

Ich habe eine Class<?>-Referenz für einen beliebigen Typ. Wie erhalte ich den Initialisierungswert dieses Typs? Gibt es dafür eine Bibliotheksmethode oder muss ich meine eigene rollen, wie:

Class<?> klass = ...
Object init = 
    (klass == boolean.class)
  ? false
  : (klass == byte.class)
  ? (byte) 0
  ...
  : (Object) null;

Der Anwendungsfall ist Ich habe eine beliebige Java.lang.reflect.Method-Referenz, die ich mit willkürlichen Parametern (für einige Tests) aufrufen möchte, die möglicherweise nicht null ist, falls es sich bei dem Parameter um einen primitiven Typ handelt, daher muss ich einen Wert dieses Typs angeben.

12
Lukas Eder

Um dies ohne Fremdanbieter-Bibliotheken zu tun, können Sie ein Array der Länge eins erstellen und das erste Element auslesen (beide Operationen über Java.lang.reflect.Array):

Object o = Array.get(Array.newInstance(klass, 1), 0);

Ab Java 9 können Sie auch verwenden

Object o = MethodHandles.zero(klass).invoke();
19
Holger

Sie können Defaults class aus der Guava-Bibliothek verwenden:

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

Drucke:

false
0
null
7
awesoon

Der Vollständigkeit halber ist dies etwas, das meiner Meinung nach zu einer Reflection-API gehört. Deshalb habe ich es zu jOOR through # 68

Object init = Reflect.initValue(klass);

Guava hat ein ähnliches Werkzeug und es gibt JDK-Dienstprogramme, die dies ebenfalls können

2
Lukas Eder

Um zu überprüfen, ob ein Parameter einer Methode primitiv ist, rufen Sie isPrimitive(); am Parametertyp auf:

Method m = ...;
// to test the first parameter only:
m.getParameterTypes()[0].isPrimitive();
0
Selaron