7.2 methodRef得method

参考Java虚拟机规范第7版
从运行时常量池拿到方法符号引用

methodref {
  String className;
  String methodName;
  String methodDescriptor;
}

以后 从methodref 可以解析出一个(可能的)method, 缓存起来
过程是,classLoad进来这个classname的class
遍历他的方法 看方法名和描述有没有对上的,
没有就找class的父类 ,
找到Object都没有 就找接口,
再不行就异常NoSuchMethodError
还要坚持当前类有没有用这个方法的权限 没就IllegalAccessError

methodref {
  className;
  name;
  descriptor;

  //解析一次就缓存
  method;

getMethod(){
    if (method == null) {
        //classLoad 当前class用的;
        class = classLoad.loadClass(className);
        //先继承链往上找,再找接口,
        method= findMethod(class, name, descriptor);

    }
    return method;
}

// 找不到沿着classload父类再找,继承链往上找,找不到在找接口 每个逻辑都是这样
//比对 方法名字和描述 都对上就是 了
  findMethod(class,  name, descriptor){
      for (aMethod in class.methods) {
          if (aMethod.name == name && aMethod.descriptor==descriptor) {
              return aMethod;
           }
      }
  } //findMethod end
}

你可能感兴趣的:(7.2 methodRef得method)