void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
                                  Symbol* method_name, Symbol* method_signature,
                                  KlassHandle current_klass, bool check_access,
                                  bool require_methodref, TRAPS) {

  Handle nested_exception;

  // 1. check if methodref required, that resolved_klass is not interfacemethodref
  if (require_methodref && resolved_klass->is_interface()) {
    ResourceMark rm(THREAD);
    char buf[200];
    jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
        resolved_klass()->external_name());
    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  }

  // 2. lookup method in resolved klass and its super klasses
  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);

  if (resolved_method.is_null() && !resolved_klass->oop_is_array()) { // not found in the class hierarchy
    // 3. lookup method in all the interfaces implemented by the resolved klass
    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);

    if (resolved_method.is_null()) {
      // JSR 292:  see if this is an implicitly generated method MethodHandle.linkToVirtual(*...), etc
      lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
                                current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
      if (HAS_PENDING_EXCEPTION) {
        nested_exception = Handle(THREAD, PENDING_EXCEPTION);
        CLEAR_PENDING_EXCEPTION;
      }
    }
  }

  if (resolved_method.is_null()) {
    // 4. method lookup failed
    ResourceMark rm(THREAD);
    THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
                    Method::name_and_sig_as_C_string(resolved_klass(),
                                                            method_name,
                                                            method_signature),
                    nested_exception);
  }

  // 5. access checks, access checking may be turned off when calling from within the VM.
  if (check_access) {
    assert(current_klass.not_null() , "current_klass should not be null");

    // check if method can be accessed by the referring class
    check_method_accessability(current_klass,
                               resolved_klass,
                               KlassHandle(THREAD, resolved_method->method_holder()),
                               resolved_method,
                               CHECK);

    // check loader constraints
    check_method_loader_constraints(resolved_method, resolved_klass, method_name,
                                    method_signature, current_klass, "method", CHECK);
  }
}
void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle resolved_klass,
                                  Symbol* method_name, Symbol* method_signature,
                                  KlassHandle current_klass, bool check_access,
                                  bool require_methodref, TRAPS) {

  Handle nested_exception;

   
  if (require_methodref && resolved_klass->is_interface()) {
    ResourceMark rm(THREAD);
    char buf[200];
    jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected",
        resolved_klass()->external_name());
    THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf);
  }

   
  lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, true, false, CHECK);

  if (resolved_method.is_null() && !resolved_klass->oop_is_array()) {  
     
    lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK);

    if (resolved_method.is_null()) {
       
      lookup_polymorphic_method(resolved_method, resolved_klass, method_name, method_signature,
                                current_klass, (Handle*)NULL, (Handle*)NULL, THREAD);
      if (HAS_PENDING_EXCEPTION) {
        nested_exception = Handle(THREAD, PENDING_EXCEPTION);
        CLEAR_PENDING_EXCEPTION;
      }
    }
  }

  if (resolved_method.is_null()) {
     
    ResourceMark rm(THREAD);
    THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(),
                    Method::name_and_sig_as_C_string(resolved_klass(),
                                                            method_name,
                                                            method_signature),
                    nested_exception);
  }

   
  if (check_access) {
    assert(current_klass.not_null() , "current_klass should not be null");

     
    check_method_accessability(current_klass,
                               resolved_klass,
                               KlassHandle(THREAD, resolved_method->method_holder()),
                               resolved_method,
                               CHECK);

     
    check_method_loader_constraints(resolved_method, resolved_klass, method_name,
                                    method_signature, current_klass, "method", CHECK);
  }
}