< prev index next >

src/hotspot/share/runtime/reflection.cpp

Print this page




 667             member_class == resolved_class ||
 668             host_class->is_subclass_of(resolved_class) ||
 669             resolved_class->is_subclass_of(host_class)) {
 670           return true;
 671         }
 672       }
 673     }
 674   }
 675 
 676   // package access
 677   if (!access.is_private() && is_same_class_package(current_class, member_class)) {
 678     return true;
 679   }
 680 
 681   // private access between different classes needs a nestmate check, but
 682   // not for unsafe anonymous classes - so check host_class
 683   if (access.is_private() && host_class == current_class) {
 684     if (current_class->is_instance_klass() && member_class->is_instance_klass() ) {
 685       InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class));
 686       InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(member_class));
 687       // Nestmate access checks may require resolution and validation of the nest-host.
 688       // It is up to the caller to check for pending exceptions and handle appropriately.
 689       bool access = cur_ik->has_nestmate_access_to(field_ik, CHECK_false);
 690       if (access) {
 691         guarantee(resolved_class->is_subclass_of(member_class), "must be!");
 692         return true;
 693       }
 694     }
 695   }
 696 
 697   // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
 698   // succeed trivially.
 699   if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
 700     return true;
 701   }
 702 
 703   // Check for special relaxations
 704   return can_relax_access_check_for(current_class, member_class, classloader_only);
 705 }
 706 
 707 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
 708   return InstanceKlass::cast(class1)->is_same_class_package(class2);
 709 }




 667             member_class == resolved_class ||
 668             host_class->is_subclass_of(resolved_class) ||
 669             resolved_class->is_subclass_of(host_class)) {
 670           return true;
 671         }
 672       }
 673     }
 674   }
 675 
 676   // package access
 677   if (!access.is_private() && is_same_class_package(current_class, member_class)) {
 678     return true;
 679   }
 680 
 681   // private access between different classes needs a nestmate check, but
 682   // not for unsafe anonymous classes - so check host_class
 683   if (access.is_private() && host_class == current_class) {
 684     if (current_class->is_instance_klass() && member_class->is_instance_klass() ) {
 685       InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class));
 686       InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(member_class));
 687       bool access = cur_ik->has_nestmate_access_to(field_ik, THREAD);


 688       if (access) {
 689         guarantee(resolved_class->is_subclass_of(member_class), "must be!");
 690         return true;
 691       }
 692     }
 693   }
 694 
 695   // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
 696   // succeed trivially.
 697   if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
 698     return true;
 699   }
 700 
 701   // Check for special relaxations
 702   return can_relax_access_check_for(current_class, member_class, classloader_only);
 703 }
 704 
 705 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
 706   return InstanceKlass::cast(class1)->is_same_class_package(class2);
 707 }


< prev index next >