src/hotspot/share/runtime/reflection.cpp
changeset 48826 c4d9d1b08e2e
parent 47765 b7c7428eaab9
child 48836 423bcbb288ff
equal deleted inserted replaced
48825:ef8a98bc71f8 48826:c4d9d1b08e2e
   763 
   763 
   764 // Utility method converting a single SignatureStream element into java.lang.Class instance
   764 // Utility method converting a single SignatureStream element into java.lang.Class instance
   765 static oop get_mirror_from_signature(const methodHandle& method,
   765 static oop get_mirror_from_signature(const methodHandle& method,
   766                                      SignatureStream* ss,
   766                                      SignatureStream* ss,
   767                                      TRAPS) {
   767                                      TRAPS) {
   768 
   768   Klass* accessing_klass = method->method_holder();
   769 
   769   assert(accessing_klass != NULL, "method has no accessing_klass");
   770   if (T_OBJECT == ss->type() || T_ARRAY == ss->type()) {
   770 
   771     Symbol* name = ss->as_symbol(CHECK_NULL);
   771   oop mirror_oop = ss->as_java_mirror(Handle(THREAD, accessing_klass->class_loader()),
   772     oop loader = method->method_holder()->class_loader();
   772                                       Handle(THREAD, accessing_klass->protection_domain()),
   773     oop protection_domain = method->method_holder()->protection_domain();
   773                                       SignatureStream::NCDFError,
   774     const Klass* k = SystemDictionary::resolve_or_fail(name,
   774                                       CHECK_NULL);
   775                                                        Handle(THREAD, loader),
   775 
   776                                                        Handle(THREAD, protection_domain),
   776   // Special tracing logic for resolution of class names during reflection.
   777                                                        true,
   777   if (log_is_enabled(Debug, class, resolve)) {
   778                                                        CHECK_NULL);
   778     Klass* result = java_lang_Class::as_Klass(mirror_oop);
   779     if (log_is_enabled(Debug, class, resolve)) {
   779     if (result != NULL) {
   780       trace_class_resolution(k);
   780       trace_class_resolution(result);
   781     }
   781     }
   782     return k->java_mirror();
       
   783   }
   782   }
   784 
   783 
   785   assert(ss->type() != T_VOID || ss->at_return_type(),
   784   assert(ss->type() != T_VOID || ss->at_return_type(),
   786     "T_VOID should only appear as return type");
   785     "T_VOID should only appear as return type");
   787 
   786 
   788   return java_lang_Class::primitive_mirror(ss->type());
   787   return mirror_oop;
   789 }
   788 }
   790 
   789 
   791 static objArrayHandle get_parameter_types(const methodHandle& method,
   790 static objArrayHandle get_parameter_types(const methodHandle& method,
   792                                           int parameter_count,
   791                                           int parameter_count,
   793                                           oop* return_type,
   792                                           oop* return_type,
   817 static objArrayHandle get_exception_types(const methodHandle& method, TRAPS) {
   816 static objArrayHandle get_exception_types(const methodHandle& method, TRAPS) {
   818   return method->resolved_checked_exceptions(THREAD);
   817   return method->resolved_checked_exceptions(THREAD);
   819 }
   818 }
   820 
   819 
   821 static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
   820 static Handle new_type(Symbol* signature, Klass* k, TRAPS) {
   822   // Basic types
   821   Handle mirror = SystemDictionary::find_java_mirror_for_type(signature, k, SignatureStream::NCDFError, CHECK_(Handle()));
   823   BasicType type = vmSymbols::signature_type(signature);
   822 
   824   if (type != T_OBJECT) {
   823   // Special tracing logic for resolution of class names during reflection.
   825     return Handle(THREAD, Universe::java_mirror(type));
       
   826   }
       
   827 
       
   828   Klass* result =
       
   829     SystemDictionary::resolve_or_fail(signature,
       
   830                                       Handle(THREAD, k->class_loader()),
       
   831                                       Handle(THREAD, k->protection_domain()),
       
   832                                       true, CHECK_(Handle()));
       
   833 
       
   834   if (log_is_enabled(Debug, class, resolve)) {
   824   if (log_is_enabled(Debug, class, resolve)) {
   835     trace_class_resolution(result);
   825     Klass* result = java_lang_Class::as_Klass(mirror());
   836   }
   826     if (result != NULL) {
   837 
   827       trace_class_resolution(result);
   838   oop nt = result->java_mirror();
   828     }
   839   return Handle(THREAD, nt);
   829   }
       
   830 
       
   831   return mirror;
   840 }
   832 }
   841 
   833 
   842 
   834 
   843 oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) {
   835 oop Reflection::new_method(const methodHandle& method, bool for_constant_pool_access, TRAPS) {
   844   // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods.
   836   // Allow sun.reflect.ConstantPool to refer to <clinit> methods as java.lang.reflect.Methods.