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

时间:2011-02-17 18:19:19

标签: java

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

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

我该如何正确地做到这一点?

4 个答案:

答案 0 :(得分:14)

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

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

参考:Reflection tutorial

  

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

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

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

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

答案 1 :(得分:3)

We use or own simple method (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);
            }
    }
}

答案 2 :(得分:2)

在这种情况下,您可以期望的最好的方法是创建一个原始地图到其Autoboxed等效项并返回该类型的类。

答案 3 :(得分:1)

尝试像这样的ApacheCommons ClassUtils:

ClassUtils.getClass(className)

很好地适用于原语。

该类的全名是org.apache.commons.lang3.ClassUtils