为什么Unsafe.allocateInstance(Class.class)失败了?

时间:2017-08-18 08:11:02

标签: java jvm unsafe

我现在使用的是不安全的。当我运行以下代码时:

unsafe.allocateInstance(Class.class)

发生了

Exception in thread "main" java.lang.IllegalAccessException: java.lang.Class

由于Class是一个非抽象类,为什么它如此特别?有没有办法构建像Class一样的“空”allocateInstance

1 个答案:

答案 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());
  }
}

这样的实例无论如何都无效,所以没有意义。