2017-08-18 3 views
0

J'utilise maintenant dangereux. Quand je lance le code suivant:Pourquoi Unsafe.allocateInstance (Class.class) a échoué?

unsafe.allocateInstance(Class.class) 

Il arrive de

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

Depuis Class est une classe non abstraite, pourquoi il est si spécial? Et est-il possible de construire un 'vide' Class comme allocateInstance?

+0

Bien 'Class' est une classe spéciale. C'est tellement proche de la JVM que je ne trouve pas étonnant que même Unsafe ne puisse pas le gérer. Que serait une «classe» «vide» après tout? – Kayaman

Répondre

1

Parce qu'il ya un contrôle explicite à l'intérieur JVM HotSpot pour veiller à ce que java.lang.Class ne peut pas être instanciée par JNI, Unsafe etc. Voir 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()); 
    } 
} 

Un tel exemple ne serait pas valable de toute façon, il n'a pas de sens .

+0

Merci. C'est ce que je cherche. Maintenant, je peux confirmer que 'Class' est spécial. –