hotspot/src/share/vm/runtime/reflection.cpp
changeset 14488 ab48109f7d1b
parent 14391 df0a1573d5bd
child 15097 9db149412e0e
equal deleted inserted replaced
14486:7d079e0eedef 14488:ab48109f7d1b
    68         source_file = s->as_C_string();
    68         source_file = s->as_C_string();
    69       }
    69       }
    70     }
    70     }
    71   }
    71   }
    72   if (caller != NULL) {
    72   if (caller != NULL) {
    73     const char * from = Klass::cast(caller)->external_name();
    73     const char * from = caller->external_name();
    74     const char * to = Klass::cast(to_class)->external_name();
    74     const char * to = to_class->external_name();
    75     // print in a single call to reduce interleaving between threads
    75     // print in a single call to reduce interleaving between threads
    76     if (source_file != NULL) {
    76     if (source_file != NULL) {
    77       tty->print("RESOLVE %s %s %s:%d (reflection)\n", from, to, source_file, line_number);
    77       tty->print("RESOLVE %s %s %s:%d (reflection)\n", from, to, source_file, line_number);
    78     } else {
    78     } else {
    79       tty->print("RESOLVE %s %s (reflection)\n", from, to);
    79       tty->print("RESOLVE %s %s (reflection)\n", from, to);
   328   if (java_lang_Class::is_primitive(element_mirror)) {
   328   if (java_lang_Class::is_primitive(element_mirror)) {
   329     Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
   329     Klass* tak = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
   330     return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
   330     return TypeArrayKlass::cast(tak)->allocate(length, THREAD);
   331   } else {
   331   } else {
   332     Klass* k = java_lang_Class::as_Klass(element_mirror);
   332     Klass* k = java_lang_Class::as_Klass(element_mirror);
   333     if (Klass::cast(k)->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
   333     if (k->oop_is_array() && ArrayKlass::cast(k)->dimension() >= MAX_DIM) {
   334       THROW_0(vmSymbols::java_lang_IllegalArgumentException());
   334       THROW_0(vmSymbols::java_lang_IllegalArgumentException());
   335     }
   335     }
   336     return oopFactory::new_objArray(k, length, THREAD);
   336     return oopFactory::new_objArray(k, length, THREAD);
   337   }
   337   }
   338 }
   338 }
   364   int dim = len;
   364   int dim = len;
   365   if (java_lang_Class::is_primitive(element_mirror)) {
   365   if (java_lang_Class::is_primitive(element_mirror)) {
   366     klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
   366     klass = basic_type_mirror_to_arrayklass(element_mirror, CHECK_NULL);
   367   } else {
   367   } else {
   368     klass = java_lang_Class::as_Klass(element_mirror);
   368     klass = java_lang_Class::as_Klass(element_mirror);
   369     if (Klass::cast(klass)->oop_is_array()) {
   369     if (klass->oop_is_array()) {
   370       int k_dim = ArrayKlass::cast(klass)->dimension();
   370       int k_dim = ArrayKlass::cast(klass)->dimension();
   371       if (k_dim + len > MAX_DIM) {
   371       if (k_dim + len > MAX_DIM) {
   372         THROW_0(vmSymbols::java_lang_IllegalArgumentException());
   372         THROW_0(vmSymbols::java_lang_IllegalArgumentException());
   373       }
   373       }
   374       dim += k_dim;
   374       dim += k_dim;
   375     }
   375     }
   376   }
   376   }
   377   klass = Klass::cast(klass)->array_klass(dim, CHECK_NULL);
   377   klass = klass->array_klass(dim, CHECK_NULL);
   378   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD);
   378   oop obj = ArrayKlass::cast(klass)->multi_allocate(len, dimensions, THREAD);
   379   assert(obj->is_array(), "just checking");
   379   assert(obj->is_array(), "just checking");
   380   return arrayOop(obj);
   380   return arrayOop(obj);
   381 }
   381 }
   382 
   382 
   385   if (java_lang_Class::is_primitive(mirror)) {
   385   if (java_lang_Class::is_primitive(mirror)) {
   386     return NULL;
   386     return NULL;
   387   }
   387   }
   388 
   388 
   389   Klass* klass = java_lang_Class::as_Klass(mirror);
   389   Klass* klass = java_lang_Class::as_Klass(mirror);
   390   if (!Klass::cast(klass)->oop_is_array()) {
   390   if (!klass->oop_is_array()) {
   391     return NULL;
   391     return NULL;
   392   }
   392   }
   393 
   393 
   394   oop result = ArrayKlass::cast(klass)->component_mirror();
   394   oop result = ArrayKlass::cast(klass)->component_mirror();
   395 #ifdef ASSERT
   395 #ifdef ASSERT
   396   oop result2 = NULL;
   396   oop result2 = NULL;
   397   if (ArrayKlass::cast(klass)->dimension() == 1) {
   397   if (ArrayKlass::cast(klass)->dimension() == 1) {
   398     if (Klass::cast(klass)->oop_is_typeArray()) {
   398     if (klass->oop_is_typeArray()) {
   399       result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL);
   399       result2 = basic_type_arrayklass_to_mirror(klass, CHECK_NULL);
   400     } else {
   400     } else {
   401       result2 = Klass::cast(ObjArrayKlass::cast(klass)->element_klass())->java_mirror();
   401       result2 = ObjArrayKlass::cast(klass)->element_klass()->java_mirror();
   402     }
   402     }
   403   } else {
   403   } else {
   404     Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension();
   404     Klass* lower_dim = ArrayKlass::cast(klass)->lower_dimension();
   405     assert(Klass::cast(lower_dim)->oop_is_array(), "just checking");
   405     assert(lower_dim->oop_is_array(), "just checking");
   406     result2 = Klass::cast(lower_dim)->java_mirror();
   406     result2 = lower_dim->java_mirror();
   407   }
   407   }
   408   assert(result == result2, "results must be consistent");
   408   assert(result == result2, "results must be consistent");
   409 #endif //ASSERT
   409 #endif //ASSERT
   410   return result;
   410   return result;
   411 }
   411 }
   440   // Additional test for protected members: JLS 6.6.2
   440   // Additional test for protected members: JLS 6.6.2
   441 
   441 
   442   if (acc.is_protected()) {
   442   if (acc.is_protected()) {
   443     if (target_class != client_class) {
   443     if (target_class != client_class) {
   444       if (!is_same_class_package(client_class, field_class)) {
   444       if (!is_same_class_package(client_class, field_class)) {
   445         if (!Klass::cast(target_class)->is_subclass_of(client_class)) {
   445         if (!target_class->is_subclass_of(client_class)) {
   446           THROW_(vmSymbols::java_lang_IllegalAccessException(), false);
   446           THROW_(vmSymbols::java_lang_IllegalAccessException(), false);
   447         }
   447         }
   448       }
   448       }
   449     }
   449     }
   450   }
   450   }
   466   }
   466   }
   467   // New (1.4) reflection implementation. Allow all accesses from
   467   // New (1.4) reflection implementation. Allow all accesses from
   468   // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
   468   // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
   469   if (   JDK_Version::is_gte_jdk14x_version()
   469   if (   JDK_Version::is_gte_jdk14x_version()
   470       && UseNewReflection
   470       && UseNewReflection
   471       && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
   471       && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
   472     return true;
   472     return true;
   473   }
   473   }
   474 
   474 
   475   // Also allow all accesses from
   475   // Also allow all accesses from
   476   // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
   476   // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
   544   }
   544   }
   545 
   545 
   546   if (access.is_protected()) {
   546   if (access.is_protected()) {
   547     if (!protected_restriction) {
   547     if (!protected_restriction) {
   548       // See if current_class is a subclass of field_class
   548       // See if current_class is a subclass of field_class
   549       if (Klass::cast(current_class)->is_subclass_of(field_class)) {
   549       if (current_class->is_subclass_of(field_class)) {
   550         if (access.is_static() || // static fields are ok, see 6622385
   550         if (access.is_static() || // static fields are ok, see 6622385
   551             current_class == resolved_class ||
   551             current_class == resolved_class ||
   552             field_class == resolved_class ||
   552             field_class == resolved_class ||
   553             Klass::cast(current_class)->is_subclass_of(resolved_class) ||
   553             current_class->is_subclass_of(resolved_class) ||
   554             Klass::cast(resolved_class)->is_subclass_of(current_class)) {
   554             resolved_class->is_subclass_of(current_class)) {
   555           return true;
   555           return true;
   556         }
   556         }
   557       }
   557       }
   558     }
   558     }
   559   }
   559   }
   564 
   564 
   565   // New (1.4) reflection implementation. Allow all accesses from
   565   // New (1.4) reflection implementation. Allow all accesses from
   566   // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
   566   // sun/reflect/MagicAccessorImpl subclasses to succeed trivially.
   567   if (   JDK_Version::is_gte_jdk14x_version()
   567   if (   JDK_Version::is_gte_jdk14x_version()
   568       && UseNewReflection
   568       && UseNewReflection
   569       && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
   569       && current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
   570     return true;
   570     return true;
   571   }
   571   }
   572 
   572 
   573   // Also allow all accesses from
   573   // Also allow all accesses from
   574   // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
   574   // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially.
   691   if (type != T_OBJECT) {
   691   if (type != T_OBJECT) {
   692     return Handle(THREAD, Universe::java_mirror(type));
   692     return Handle(THREAD, Universe::java_mirror(type));
   693   }
   693   }
   694 
   694 
   695   oop loader = InstanceKlass::cast(k())->class_loader();
   695   oop loader = InstanceKlass::cast(k())->class_loader();
   696   oop protection_domain = Klass::cast(k())->protection_domain();
   696   oop protection_domain = k()->protection_domain();
   697   Klass* result = SystemDictionary::resolve_or_fail(signature,
   697   Klass* result = SystemDictionary::resolve_or_fail(signature,
   698                                     Handle(THREAD, loader),
   698                                     Handle(THREAD, loader),
   699                                     Handle(THREAD, protection_domain),
   699                                     Handle(THREAD, protection_domain),
   700                                     true, CHECK_(Handle()));
   700                                     true, CHECK_(Handle()));
   701 
   701 
   702   if (TraceClassResolution) {
   702   if (TraceClassResolution) {
   703     trace_class_resolution(result);
   703     trace_class_resolution(result);
   704   }
   704   }
   705 
   705 
   706   oop nt = Klass::cast(result)->java_mirror();
   706   oop nt = result->java_mirror();
   707   return Handle(THREAD, nt);
   707   return Handle(THREAD, nt);
   708 }
   708 }
   709 
   709 
   710 
   710 
   711 oop Reflection::new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS) {
   711 oop Reflection::new_method(methodHandle method, bool intern_name, bool for_constant_pool_access, TRAPS) {
   935             // new default: 6531596
   935             // new default: 6531596
   936             if (ReflectionWrapResolutionErrors) {
   936             if (ReflectionWrapResolutionErrors) {
   937               ResourceMark rm(THREAD);
   937               ResourceMark rm(THREAD);
   938               Handle h_origexception = Exceptions::new_exception(THREAD,
   938               Handle h_origexception = Exceptions::new_exception(THREAD,
   939                      vmSymbols::java_lang_AbstractMethodError(),
   939                      vmSymbols::java_lang_AbstractMethodError(),
   940                      Method::name_and_sig_as_C_string(Klass::cast(target_klass()),
   940                      Method::name_and_sig_as_C_string(target_klass(),
   941                      method->name(),
   941                      method->name(),
   942                      method->signature()));
   942                      method->signature()));
   943               JavaCallArguments args(h_origexception);
   943               JavaCallArguments args(h_origexception);
   944               THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
   944               THROW_ARG_0(vmSymbols::java_lang_reflect_InvocationTargetException(),
   945                 vmSymbols::throwable_void_signature(),
   945                 vmSymbols::throwable_void_signature(),
   946                 &args);
   946                 &args);
   947             } else {
   947             } else {
   948               ResourceMark rm(THREAD);
   948               ResourceMark rm(THREAD);
   949               THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
   949               THROW_MSG_0(vmSymbols::java_lang_AbstractMethodError(),
   950                         Method::name_and_sig_as_C_string(Klass::cast(target_klass()),
   950                         Method::name_and_sig_as_C_string(target_klass(),
   951                                                                 method->name(),
   951                                                                 method->name(),
   952                                                                 method->signature()));
   952                                                                 method->signature()));
   953             }
   953             }
   954           }
   954           }
   955         }
   955         }
   960   // I believe this is a ShouldNotGetHere case which requires
   960   // I believe this is a ShouldNotGetHere case which requires
   961   // an internal vtable bug. If you ever get this please let Karen know.
   961   // an internal vtable bug. If you ever get this please let Karen know.
   962   if (method.is_null()) {
   962   if (method.is_null()) {
   963     ResourceMark rm(THREAD);
   963     ResourceMark rm(THREAD);
   964     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
   964     THROW_MSG_0(vmSymbols::java_lang_NoSuchMethodError(),
   965                 Method::name_and_sig_as_C_string(Klass::cast(klass()),
   965                 Method::name_and_sig_as_C_string(klass(),
   966                                                         reflected_method->name(),
   966                                                         reflected_method->name(),
   967                                                         reflected_method->signature()));
   967                                                         reflected_method->signature()));
   968   }
   968   }
   969 
   969 
   970   // In the JDK 1.4 reflection implementation, the security check is
   970   // In the JDK 1.4 reflection implementation, the security check is