如何实例化原始类型的Class类?

yeg*_*256 17 java

我正在尝试这样做,但不起作用:

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

我该怎么做呢?

Boz*_*zho 15

你不能,因为原语不是对象.

你目前正在尝试的是尚未实例化 - 它正在加载一个类.但你不能为原始人做到这一点.int确实是用于int类型的名称,无论何时Class获得它们的对象(例如通过反射method.getReturnType()),但是你无法加载它forName().

参考:反思教程:

如果类的完全限定名称可用,则可以使用静态方法Class.forName()获取相应的Class.这不能用于原始类型

实例化一个原语的解决方案是使用commons-lang ClassUtils,它可以获得与给定原语相对应的包装类:

if (clazz.isPrimitive() {
    clazz = ClassUtils.primitiveToWrapper(clazz);
}
clazz.newInstance();
Run Code Online (Sandbox Code Playgroud)

请注意,这假设您具有Class表示int类型 - 通过反射或通过文字(int.class).但是,除了我之外,还有一个字符串表示形式的用法.你可以forName("java.lang.Integer")改用.


rmu*_*ler 5

我们使用或拥有一个简单的方法(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);
            }
    }
}
Run Code Online (Sandbox Code Playgroud)