hotspot/src/share/vm/runtime/reflection.cpp
changeset 4571 80b553bddc26
parent 2332 5c7b6f4ce0a1
child 4581 e89fbd1bcb3d
equal deleted inserted replaced
4569:f372ea9e5ed4 4571:80b553bddc26
   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