我现在使用的是不安全的。当我运行以下代码时:
unsafe.allocateInstance(Class.class)
发生了
Exception in thread "main" java.lang.IllegalAccessException: java.lang.Class
由于Class
是一个非抽象类,为什么它如此特别?有没有办法构建像Class
一样的“空”allocateInstance
?
答案 0 :(得分:1)
因为在HotSpot JVM中有一个显式检查,以确保{J}不能通过JNI,不安全等实例化java.lang.Class
。请参阅instanceKlass.cpp:
void InstanceKlass::check_valid_for_instantiation(bool throwError, TRAPS) {
if (is_interface() || is_abstract()) {
ResourceMark rm(THREAD);
THROW_MSG(throwError ? vmSymbols::java_lang_InstantiationError()
: vmSymbols::java_lang_InstantiationException(), external_name());
}
if (this == SystemDictionary::Class_klass()) {
ResourceMark rm(THREAD);
THROW_MSG(throwError ? vmSymbols::java_lang_IllegalAccessError()
: vmSymbols::java_lang_IllegalAccessException(), external_name());
}
}
这样的实例无论如何都无效,所以没有意义。