![](/img/trans.png)
[英]Registering a class for instantiating via Unsafe.allocateInstance in graalvm native image
[英]Why Unsafe.allocateInstance(Class.class) failed?
我现在使用的是不安全的。 当我运行以下代码时:
unsafe.allocateInstance(Class.class)
发生了
Exception in thread "main" java.lang.IllegalAccessException: java.lang.Class
既然Class
是一个非抽象类,为什么它如此特别? 并且有什么方法可以构造一个像allocateInstance
这样的“空” Class
吗?
因为在HotSpot JVM内部进行了显式检查,以确保无法通过JNI,Unsafe等实例化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());
}
}
这样的实例无论如何都是无效的,因此没有任何意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.