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

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

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

我该怎么做呢?

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

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

参考: 反思教程 :

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

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

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

请注意,这假设您具有表示int类型的Class – 通过reflection或通过文字( int.class )。 但是,除了我之外,有一个字符串表示forms的用法。 您可以使用forName("java.lang.Integer")代替。

在这种情况下,您可以期望的最好的方法是为其Autoboxed等效项创建基元映射并返回该类型的类。

尝试像这样的ApacheCommons ClassUtils:

 ClassUtils.getClass(className) 

很好地适用于原语。

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

我们使用或拥有简单的方法(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); } } }