2020_07_07 学习日记

早上:

        1、 照着抄同学的一个小练手的时候,看到他的代码里自定义异常类有个奇怪的 final long,问了他:原来异常类型还要带编号的。。。顺便百度了一下,然后还看到 实现 Serializable 的 应该有个  serialVersionUID  是为了增强版本迭代的鲁棒性,学到了学到了。

        2、同学的小练手被我匆匆抄了一遍,感觉,web肯定是还不太熟练的。主要是后面要把 timetable5.0 里面的知识吃下来就好了,哎,昨天玩了一天手机,亚历山大。我想要一天有48小时给我,我枯了。

下午:

JmxCollector 的个人解析:

1、继承自 Collector 类 ,Collector类是各类具体监控器(如Gauge、Counter)的父类,

  1. 里面有一个Describable接口,用List存储了各类信息,可以不实现,则会有一个默认的describable。
  2. Type也是里面的一个成员变量,类型是 enum ,记录的是子监控器类型名的样子,GAUGE、HISTOGRAM、UNTYPED等

2、有两个私有的静态内部类 Rule 和 Config。

3、JmxMBeanPropertyCache :该开源项目自己的类,用于存了一个 mBean 的mapping。 mBean 的 objectNames to key property lists。 主要目的是减少当我们找不到 mBeans 时调用 PROPERTY_PATTERN 的频率。

方法:

1、JmxCollector 的构造方法:

  1. 单传 File 是更新 config 。 (这一块提到的 config 的类型是上面提到的,私有的静态内部类)
  2. 单传String 类型的 yamlConfig 也是更新 config 。
  3. 单传一个 InputStream 也是更新 config 。

2、两个 reloadConfig 方法:

  1. 无参方法:根据持有的private File configFile 更新 config。 更新后会根据成功或失败记录log,并调用inc()方法将无标签的 counter 增 1。
  2. Map yamlConfig: 该方法会返回自己声明的 Config 。 后面一大串各种 if ,return 了一个内部新建的 Config

3、 static String toSnakeAndLowerCase(String attrName) 

  1. 传入参数为空则直接返回 attrName
  2. 将一个String类型的 变量名称 转换成一个 所有位小写,且驼峰命名的单词中间用下划线隔开的 String 。(即命名格式转换)
static String toSnakeAndLowerCase(String attrName) {
      if (attrName == null || attrName.isEmpty()) {
        return attrName;
      }
      // 取出首位
      char firstChar = attrName.subSequence(0, 1).charAt(0);
      // 字符是大写的或者下划线 则 为 true
      boolean prevCharIsUpperCaseOrUnderscore = Character.isUpperCase(firstChar) || firstChar == '_';
      // 新建了一个初始长度是和传入参数登场的StringBuilder,
      // 然后append了转成小写的传入参数的首位char
      StringBuilder resultBuilder = new StringBuilder(attrName.length()).append(Character.toLowerCase(firstChar));

      // 遍历传入 String 除开首位的部分
      for (char attrChar : attrName.substring(1).toCharArray()) {
        // 获取当前位是不是大写
        boolean charIsUpperCase = Character.isUpperCase(attrChar);
        if (!prevCharIsUpperCaseOrUnderscore && charIsUpperCase) {
          // 进来的条件为 首位(第一次)或 标志位(第二次及后续)
          // 不是 大写或下划线  且  当前遍历位为 大写字母 , 
          // 则 给结果 append 一个下划线
          resultBuilder.append("_");
        }
        // 当前位转小写 然后 append进来
        resultBuilder.append(Character.toLowerCase(attrChar));
        // 标志 boolean 赋值为 当前位是否大写 或 当前位是 下划线
        prevCharIsUpperCaseOrUnderscore = charIsUpperCase || attrChar == '_';
      }
      // StringBuilder 转 String
      return resultBuilder.toString();
  }

4、static String safeName(String name)  自带注释:将无效字符转成下划线并合并多个下划线 

      注意:如果开头是数字的话,会先 append 一个下划线进去

5、private static boolean isLegalCharacter(char input)  当传入的 char 为 : 或 _ 或 26个字母或数字,返回 true

6、一个内部类 Receiver 实现了 JmxScraper.MBeanReceiver 接口 (这个接口是项目里自己声明的)

 

JmxMBeanPropertyCache 的 个人解析:

1、private static final Pattern PROPERTY_PATTERN 这是一个规定好了的 Pattern,已经详尽地初始化完了

2、private final Map> keyPropertiesPerBean;   自带的注释说:实现ObjectName的getKeyPropertyList的一个版本,它以添加属性的顺序返回属性(ObjectName以添加属性的顺序存储它们)。

        a) 一开始看见这有个 final 关键字还挺疑惑的,加了 final 还怎么用,后来明白了:final 只是不让修改 Map ,但我可以修改 Map 里面的东西。 

        b) Note: 一个 ObjectName 类型的键, 对应的是一个 完整的 LinkedHashMap, 即一个 map 而非 一个键值对

3、public LinkedHashMap getKeyPropertyList(ObjectName mbeanName)  

      在这里,我去 jdk官方文档 看了一下 ObjectName 到底是个什么东西

      第一行说明: Represents the object name of an MBean, or a pattern that can match the names of several MBeans. Instances of this class are immutable.

      问了问同学,去搜了一下javax,然后又草草看了一篇 MBean 的博客。

     这个方法下面说实话没看懂返回了个啥,但大概就是用pattern去匹配了些

4、public void onlyKeepMBeans(Set latestBeans)   这个是会在 keyPropertiesPerBean 中删除传入的 latestBeans 所没有的 ObjectName    (这个也没咋看懂)

 

你可能感兴趣的:(学习日记)