447 } |
447 } |
448 // New (1.4) reflection implementation. Allow all accesses from |
448 // New (1.4) reflection implementation. Allow all accesses from |
449 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
449 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
450 if ( JDK_Version::is_gte_jdk14x_version() |
450 if ( JDK_Version::is_gte_jdk14x_version() |
451 && UseNewReflection |
451 && UseNewReflection |
452 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_magic_klass())) { |
452 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
453 return true; |
453 return true; |
454 } |
454 } |
455 |
455 |
456 return can_relax_access_check_for(current_class, new_class, classloader_only); |
456 return can_relax_access_check_for(current_class, new_class, classloader_only); |
457 } |
457 } |
539 |
539 |
540 // New (1.4) reflection implementation. Allow all accesses from |
540 // New (1.4) reflection implementation. Allow all accesses from |
541 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
541 // sun/reflect/MagicAccessorImpl subclasses to succeed trivially. |
542 if ( JDK_Version::is_gte_jdk14x_version() |
542 if ( JDK_Version::is_gte_jdk14x_version() |
543 && UseNewReflection |
543 && UseNewReflection |
544 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_magic_klass())) { |
544 && Klass::cast(current_class)->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) { |
545 return true; |
545 return true; |
546 } |
546 } |
547 |
547 |
548 return can_relax_access_check_for( |
548 return can_relax_access_check_for( |
549 current_class, field_class, classloader_only); |
549 current_class, field_class, classloader_only); |
629 } |
629 } |
630 |
630 |
631 |
631 |
632 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) { |
632 objArrayHandle Reflection::get_parameter_types(methodHandle method, int parameter_count, oop* return_type, TRAPS) { |
633 // Allocate array holding parameter types (java.lang.Class instances) |
633 // Allocate array holding parameter types (java.lang.Class instances) |
634 objArrayOop m = oopFactory::new_objArray(SystemDictionary::class_klass(), parameter_count, CHECK_(objArrayHandle())); |
634 objArrayOop m = oopFactory::new_objArray(SystemDictionary::Class_klass(), parameter_count, CHECK_(objArrayHandle())); |
635 objArrayHandle mirrors (THREAD, m); |
635 objArrayHandle mirrors (THREAD, m); |
636 int index = 0; |
636 int index = 0; |
637 // Collect parameter types |
637 // Collect parameter types |
638 symbolHandle signature (THREAD, method->signature()); |
638 symbolHandle signature (THREAD, method->signature()); |
639 SignatureStream ss(signature); |
639 SignatureStream ss(signature); |
1306 if (java_lang_Class::is_primitive(mirror)) return NULL; |
1306 if (java_lang_Class::is_primitive(mirror)) return NULL; |
1307 klassOop klass = java_lang_Class::as_klassOop(mirror); |
1307 klassOop klass = java_lang_Class::as_klassOop(mirror); |
1308 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL; |
1308 if (Klass::cast(klass)->oop_is_array() && which == MEMBER_DECLARED) return NULL; |
1309 |
1309 |
1310 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { |
1310 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { |
1311 klass = SystemDictionary::object_klass(); |
1311 klass = SystemDictionary::Object_klass(); |
1312 } |
1312 } |
1313 instanceKlassHandle h_k(THREAD, klass); |
1313 instanceKlassHandle h_k(THREAD, klass); |
1314 |
1314 |
1315 // Ensure klass is linked (need not be initialized) |
1315 // Ensure klass is linked (need not be initialized) |
1316 h_k->link_class(CHECK_NULL); |
1316 h_k->link_class(CHECK_NULL); |
1373 |
1373 |
1374 objArrayOop Reflection::reflect_methods(oop mirror, jint which, TRAPS) { |
1374 objArrayOop Reflection::reflect_methods(oop mirror, jint which, TRAPS) { |
1375 // Exclude primitive types |
1375 // Exclude primitive types |
1376 if (java_lang_Class::is_primitive(mirror) || |
1376 if (java_lang_Class::is_primitive(mirror) || |
1377 (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array() && (which == MEMBER_DECLARED))) { |
1377 (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array() && (which == MEMBER_DECLARED))) { |
1378 klassOop klass = SystemDictionary::reflect_method_klass(); |
1378 klassOop klass = SystemDictionary::reflect_Method_klass(); |
1379 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array |
1379 return oopFactory::new_objArray(klass, 0, CHECK_NULL); // Return empty array |
1380 } |
1380 } |
1381 |
1381 |
1382 klassOop klass = java_lang_Class::as_klassOop(mirror); |
1382 klassOop klass = java_lang_Class::as_klassOop(mirror); |
1383 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { |
1383 if (Klass::cast(java_lang_Class::as_klassOop(mirror))->oop_is_array()) { |
1384 klass = SystemDictionary::object_klass(); |
1384 klass = SystemDictionary::Object_klass(); |
1385 } |
1385 } |
1386 instanceKlassHandle h_k(THREAD, klass); |
1386 instanceKlassHandle h_k(THREAD, klass); |
1387 |
1387 |
1388 // Ensure klass is linked (need not be initialized) |
1388 // Ensure klass is linked (need not be initialized) |
1389 h_k->link_class(CHECK_NULL); |
1389 h_k->link_class(CHECK_NULL); |
1409 } |
1409 } |
1410 } |
1410 } |
1411 } |
1411 } |
1412 |
1412 |
1413 // Allocate result |
1413 // Allocate result |
1414 klassOop klass = SystemDictionary::reflect_method_klass(); |
1414 klassOop klass = SystemDictionary::reflect_Method_klass(); |
1415 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); |
1415 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); |
1416 objArrayHandle h_result (THREAD, r); |
1416 objArrayHandle h_result (THREAD, r); |
1417 |
1417 |
1418 // Fill in results backwards |
1418 // Fill in results backwards |
1419 { |
1419 { |
1460 count++; |
1460 count++; |
1461 } |
1461 } |
1462 } |
1462 } |
1463 } |
1463 } |
1464 // Allocate result |
1464 // Allocate result |
1465 klassOop klass = SystemDictionary::reflect_method_klass(); |
1465 klassOop klass = SystemDictionary::reflect_Method_klass(); |
1466 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); |
1466 objArrayOop r = oopFactory::new_objArray(klass, count, CHECK_NULL); |
1467 objArrayHandle h_result (THREAD, r); |
1467 objArrayHandle h_result (THREAD, r); |
1468 |
1468 |
1469 // Fill in results backwards |
1469 // Fill in results backwards |
1470 { |
1470 { |
1521 objArrayOop Reflection::reflect_constructors(oop mirror, jint which, TRAPS) { |
1521 objArrayOop Reflection::reflect_constructors(oop mirror, jint which, TRAPS) { |
1522 // Exclude primitive, interface and array types |
1522 // Exclude primitive, interface and array types |
1523 bool prim = java_lang_Class::is_primitive(mirror); |
1523 bool prim = java_lang_Class::is_primitive(mirror); |
1524 Klass* k = prim ? NULL : Klass::cast(java_lang_Class::as_klassOop(mirror)); |
1524 Klass* k = prim ? NULL : Klass::cast(java_lang_Class::as_klassOop(mirror)); |
1525 if (prim || k->is_interface() || k->oop_is_array()) { |
1525 if (prim || k->is_interface() || k->oop_is_array()) { |
1526 return oopFactory::new_objArray(SystemDictionary::reflect_constructor_klass(), 0, CHECK_NULL); // Return empty array |
1526 return oopFactory::new_objArray(SystemDictionary::reflect_Constructor_klass(), 0, CHECK_NULL); // Return empty array |
1527 } |
1527 } |
1528 |
1528 |
1529 // Must be instanceKlass at this point |
1529 // Must be instanceKlass at this point |
1530 instanceKlassHandle h_k(THREAD, java_lang_Class::as_klassOop(mirror)); |
1530 instanceKlassHandle h_k(THREAD, java_lang_Class::as_klassOop(mirror)); |
1531 |
1531 |