< prev index next >

src/hotspot/share/runtime/reflection.cpp

Print this page




 692       if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) {
 693         if (access.is_static() || // static fields are ok, see 6622385
 694             current_class == resolved_class ||
 695             field_class == resolved_class ||
 696             host_class->is_subclass_of(resolved_class) ||
 697             resolved_class->is_subclass_of(host_class)) {
 698           return true;
 699         }
 700       }
 701     }
 702   }
 703 
 704   // package access
 705   if (!access.is_private() && is_same_class_package(current_class, field_class)) {
 706     return true;
 707   }
 708 
 709   // private access between different classes needs a nestmate check, but
 710   // not for anonymous classes - so check host_class
 711   if (access.is_private() && host_class == current_class) {

 712     if (current_class->is_instance_klass() && field_class->is_instance_klass() ) {
 713       InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class));
 714       InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(field_class));
 715       if (cur_ik->has_nestmate_access_to(field_ik, Thread::current())) {






 716         guarantee(resolved_class->is_subclass_of(field_class), "must be!");
 717         return true;
 718       }
 719     }
 720   }
 721 
 722   // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
 723   // succeed trivially.
 724   if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
 725     return true;
 726   }
 727 
 728   // Check for special relaxations
 729   return can_relax_access_check_for(current_class, field_class, classloader_only);
 730 }
 731 
 732 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
 733   return InstanceKlass::cast(class1)->is_same_class_package(class2);
 734 }
 735 




 692       if (!host_class->is_interface() && host_class->is_subclass_of(field_class)) {
 693         if (access.is_static() || // static fields are ok, see 6622385
 694             current_class == resolved_class ||
 695             field_class == resolved_class ||
 696             host_class->is_subclass_of(resolved_class) ||
 697             resolved_class->is_subclass_of(host_class)) {
 698           return true;
 699         }
 700       }
 701     }
 702   }
 703 
 704   // package access
 705   if (!access.is_private() && is_same_class_package(current_class, field_class)) {
 706     return true;
 707   }
 708 
 709   // private access between different classes needs a nestmate check, but
 710   // not for anonymous classes - so check host_class
 711   if (access.is_private() && host_class == current_class) {
 712     // FIXME: can we actually get here with non-instance classes?
 713     if (current_class->is_instance_klass() && field_class->is_instance_klass() ) {
 714       InstanceKlass* cur_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(current_class));
 715       InstanceKlass* field_ik = const_cast<InstanceKlass*>(InstanceKlass::cast(field_class));
 716       // Nestmate access checks may require resolution and validation of the nest-host
 717       Thread* THREAD = Thread::current();
 718       bool access = cur_ik->has_nestmate_access_to(field_ik, THREAD);
 719       if (HAS_PENDING_EXCEPTION) {
 720         return false;
 721       }
 722       if (access) {
 723         guarantee(resolved_class->is_subclass_of(field_class), "must be!");
 724         return true;
 725       }
 726     }
 727   }
 728 
 729   // Allow all accesses from jdk/internal/reflect/MagicAccessorImpl subclasses to
 730   // succeed trivially.
 731   if (current_class->is_subclass_of(SystemDictionary::reflect_MagicAccessorImpl_klass())) {
 732     return true;
 733   }
 734 
 735   // Check for special relaxations
 736   return can_relax_access_check_for(current_class, field_class, classloader_only);
 737 }
 738 
 739 bool Reflection::is_same_class_package(const Klass* class1, const Klass* class2) {
 740   return InstanceKlass::cast(class1)->is_same_class_package(class2);
 741 }
 742 


< prev index next >