57 Stimmen

Java Reflection ruft Konstruktor mit primitiven Typen auf

Ich habe eine Methode in meinem Test-Framework, die abhängig von den übergebenen Parametern eine Instanz einer Klasse erzeugt:

public void test(Object... constructorArgs) throws Exception {
    Constructor<T> con;
    if (constructorArgs.length > 0) {
        Class<?>[] parameterTypes = new Class<?>[constructorArgs.length];
        for (int i = 0; i < constructorArgs.length; i++) {
            parameterTypes[i] = constructorArgs[i].getClass();  
        }
        con = clazz.getConstructor(parameterTypes);
    } else {
        con = clazz.getConstructor();
    }
}

Das Problem ist, dass dies nicht funktioniert, wenn der Konstruktor primitive Typen hat, wie folgt:

public Range(String name, int lowerBound, int upperBound) { ... }

.test("a", 1, 3);

Ergebnisse in:

java.lang.NoSuchMethodException: Range.<init>(java.lang.String, java.lang.Integer, java.lang.Integer)

Die primitiven Ints werden automatisch in Objektversionen umgewandelt, aber wie bekomme ich sie für den Aufruf des Konstruktors zurück?

1voto

Pwnstar Punkte 2388

Um tatsächlich zu prüfen, ob ein Typ ein Primitiv oder ein Wrapper ist, verwenden Sie:

ClassUtils.isPrimitiveOrWrapper(memberClazz)

Falls Sie überprüfen wollen, ob es sich um einen bestimmten Typ handelt, sehen Sie sich dies an:

https://stackoverflow.com/a/27400967/2739334

Auf jeden Fall hatte @Andrzej Doyle völlig recht!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X