📓 Archive

PROPERTIES

FGJ: Create:2024/08/04 Update: [2024-12-08]

  • Intro(PROPERTIES) #

    • System.properties() #

      System类中有 initProperties(Properties props); native 方法。在C代码 GetJavaProperties(env);中会获取到一些props。这个方法的实现在 java_props_md.c中。在 626 行setProxyProperties(&sprops); 会进行系统代理的设置。继续调用到 java_props_maxosx.c中。主要会使用 macosx SDK 中的 SCDynamicStoreCopyProxies(_:) 【函数调用 C Demo】, 获取当前系统中的网络代理设置。需要注意与环境变量进行区分。

    • Prop对unicode编码的处理 #

      在查看 Spring国际化(i18n)ResourceBundle 相关的代码的时候,发现都会用到Properties类相关的处理。而且对于 unicode 的处理都是由这个类去自动处理的。所以跟踪了相关代码,对这部分做一个记录。

      大概的原理是:
      1).java.util.Properties#load0 读取每一行,通过=: 分割每一个key和value。在最后对key和value分别进行转换。
      2). 调用 java.util.Properties#loadConvert 进行转换操作。转换过程:碰见\u将后面的四位使用算法转换成十进制数字,当成一个char类型的字符。在原来的数组上面进行覆盖。

      相关算法如下图:

      Caution

      比如将\u4f60转成字符char20320. 过程如下:

      第一个字符'4',进到循环后,执行(value << 4) + aChar - '0'; 此时 value = 0,左移四位还是0 ,再加上字符'4'表示的整型值 4 (正好是当前字符'4''0'字符的差值) 最后value = 0100;
      第二个字符'f',进来后执行(value << 4) + 10 + aChar - 'a'; 此时将上一步得到的value 左移四位,得到0100 0000 然后与实际值('f'表示的整型值 15 1111)想加,即得到0100 1111
      依此类推:最终得到的value = 0100 1111 0110 0000 = 20320

  • Reference #


comments powered by Disqus