code: public String queryAttribute(String property) {
          try {
              Object oldValue = null;
              if (property.charAt(0) == RpcConstants.HIDE_KEY_PREFIX) {
                  // 方法级配置 例如.echoStr.timeout
                  String methodAndP = property.substring(1);
                  int index = methodAndP.indexOf(RpcConstants.HIDE_KEY_PREFIX);
                  if (index <= 0) {
                      throw ExceptionUtils.buildRuntime(property, "", "Unknown query attribute key!");
                  }
                  String methodName = methodAndP.substring(0, index);
                  String methodProperty = methodAndP.substring(index + 1);
                  MethodConfig methodConfig = getMethodConfig(methodName);
                  if (methodConfig != null) {
                      Method getMethod = ReflectUtils.getPropertyGetterMethod(MethodConfig.class, methodProperty);
                      Class propertyClazz = getMethod.getReturnType(); // 旧值的类型
                      oldValue = BeanUtils.getProperty(methodConfig, methodProperty, propertyClazz);
                  }
              } else { // 接口级配置 例如timeout
                  // 先通过get方法找到类型
                  Method getMethod = ReflectUtils.getPropertyGetterMethod(getClass(), property);
                  Class propertyClazz = getMethod.getReturnType(); // 旧值的类型
                  // 拿到旧的值
                  oldValue = BeanUtils.getProperty(this, property, propertyClazz);
              }
              return oldValue == null ? null : oldValue.toString();
          } catch (Exception e) {
              throw new SofaRpcRuntimeException("Exception when query attribute, The key is " + property, e);
          }
      }
docs: 查询属性值
  
  @param property 属性
  @return oldValue 属性值