我们可以使用Class.forName("[B")
来获取字节数组,但是我们为原始字节类添加了什么:
例如
Class.forName("??") => java.lang.Byte.TYPE
我尝试了"java.lang.Byte.TYPE"
,"byte"
和"B"
,但它们不起作用
答案 0 :(得分:3)
通常,Class
实例由ClassLoader
创建。因此,对于来自不同Class
实例的同一个类,您可以拥有2个ClassLoader
个实例。
原始类型不是这样。每个JVM的每个基本类型只有一个Class
实例。它是从native
类中的Class
方法创建并返回的。
static native Class getPrimitiveClass(String name);
这是直接分配给Byte.TYPE
public static final Class<Byte> TYPE = (Class<Byte>) Class.getPrimitiveClass("byte");
或在您执行时返回
byte.class
您无法使用Class.forName(..)
来获取它。
答案 1 :(得分:2)
这是不可能的。 The doc似乎确实可能会出现这种情况,并说:
使用给定的字符串名称返回与类或接口关联的类对象。
由于基元没有类(只有类对象来表示它们以用于反射),因此不能以这种方式检索它们。
如果有想要这样的用途(IE不仅仅是出于好奇心的想法),下面的助手类包括它们:
import java.util.Map;
import java.util.HashMap;
import java.util.Collections;
public final class ForName {
private ForName() {}
private static final Map<String, Class<?>> PRIM = (
Collections.unmodifiableMap(
new HashMap<String, Class<?>>(16) {
{
for(Class<?> cls : new Class<?>[] {
void.class,
boolean.class,
char.class,
byte.class,
short.class,
int.class,
long.class,
float.class,
double.class
}) {
put(cls.getName(), cls);
}
}
}
)
);
public static Class<?> forName(final String name)
throws ClassNotFoundException {
final Class<?> prim = PRIM.get(name);
if(prim != null)
return prim;
return Class.forName(name);
}
}
答案 2 :(得分:0)
对于基本类型和void,无法从forName获得Class对象。您必须使用类文字, int.class 或相应包装类的TYPE字段,例如 Void.TYPE 。
如果坚持使用forName,则可以首先获取对应数组类型的Class对象,然后使用getComponentType获取原始类型本身。例如:
Class<?> c = Class.forName("[B");
Class<?> primitive = c.getComponentType();
答案 3 :(得分:-1)
你有没有尝试过:
Class<?> t = Class.forName("java.lang.Byte");
我没有对此进行过测试,另外您还没有显示任何示例代码,而您正在尝试做什么....