Как создать класс класса для примитивного типа?

Я пытаюсь сделать это, но не работает:

public static Class loadIt(String name) throws Throwable {
  return Class.forName(name);
}
assert foo.loadIt("int") == int.class; // exception here

Как мне это сделать правильно?

Ответы

Ответ 1

Вы не можете, потому что примитивы не являются объектами.

То, что вы пытаетесь в настоящее время, хотя и не является экземпляром, - это загрузка класса. Но вы не можете сделать это для примитивов. int действительно является именем, которое используется для типов int, когда их объект Class получается (через отражение, например method.getReturnType()), но вы не можете загрузить его с помощью forName().

Ссылка: Учебник по отражению:

Если доступно полное имя класса, можно получить соответствующий класс, используя статический метод Class.forName(). Это не может использоваться для примитивных типов

Решение для создания примитива состоит в том, чтобы использовать commons-lang ClassUtils, который может получить класс-оболочку, соответствующий данному примитиву:

if (clazz.isPrimitive() {
    clazz = ClassUtils.primitiveToWrapper(clazz);
}
clazz.newInstance();

Обратите внимание, что это предполагает, что Class представляет тип int - либо через отражение, либо через литерал (int.class). Но это вне меня то, что было бы обязательным для того, чтобы иметь строковое представление об этом. Вместо этого вы можете использовать forName("java.lang.Integer").

Ответ 2

В этом случае, на что вы можете надеяться, нужно создать карту примитивов для их эквивалента Autoboxed и вернуть класс этого типа.

Ответ 3

Попробуйте ApacheCommons ClassUtils:

ClassUtils.getClass(className)

Хорошо работает для примитивов.

Полное имя для класса - org.apache.commons.lang3.ClassUtils

Ответ 4

Мы используем или владеем простым методом (Java 7 +):

/**
 * Return the java {@link java.lang.Class} object with the specified class name.
 *
 * This is an "extended" {@link java.lang.Class#forName(java.lang.String) } operation.
 *
 * + It is able to return Class objects for primitive types
 * + Classes in name space `java.lang` do not need the fully qualified name
 * + It does not throw a checked Exception
 *
 * @param className The class name, never `null`
 *
 * @throws IllegalArgumentException if no class can be loaded
 */
public static Class<?> parseType(final String className) {
    switch (className) {
        case "boolean":
            return boolean.class;
        case "byte":
            return byte.class;
        case "short":
            return short.class;
        case "int":
            return int.class;
        case "long":
            return long.class;
        case "float":
            return float.class;
        case "double":
            return double.class;
        case "char":
            return char.class;
        case "void":
            return void.class;
        default:
            String fqn = className.contains(".") ? className : "java.lang.".concat(className);
            try {
                return Class.forName(fqn);
            } catch (ClassNotFoundException ex) {
                throw new IllegalArgumentException("Class not found: " + fqn);
            }
    }
}

Ответ 5

Или просто используйте Поле myField = appClass.getDreclaredField( "yourFieldName" ); int value = (int) myField.get(Integer.class)

ofc, добавьте остальные проверки, необходимые для исключения неправильного класса.

Приветствия