src/share/vm/runtime/reflection.cpp

changeset 4278
070d523b96a7
parent 4251
18fb7da42534
child 4393
35431a769282
equal deleted inserted replaced
4276:8c413497f434 4278:070d523b96a7
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

mercurial