2009-08-14 57 views
0

我在做一個Junit教程,我遇到了這個正在測試的規範化函數。它是這樣定義的:這是如何規範化功能的工作?

public static String normalizeWord(String word) { 
     try { 
      int i; 
      Class<?> normalizerClass = Class.forName("java.text.Normalizer"); 
      Class<?> normalizerFormClass = null; 
      Class<?>[] nestedClasses = normalizerClass.getDeclaredClasses(); 
      for (i = 0; i < nestedClasses.length; i++) { 
       Class<?> nestedClass = nestedClasses[i]; 
       if (nestedClass.getName().equals("java.text.Normalizer$Form")) { 
        normalizerFormClass = nestedClass; 
       } 
      } 
      assert normalizerFormClass.isEnum(); 
      Method methodNormalize = normalizerClass.getDeclaredMethod(
                  "normalize", 
                  CharSequence.class, 
                  normalizerFormClass); 
      Object nfcNormalization = null; 
      Object[] constants = normalizerFormClass.getEnumConstants(); 
      for (i = 0; i < constants.length; i++) { 
       Object constant = constants[i]; 
       if (constant.toString().equals("NFC")) { 
        nfcNormalization = constant; 
       } 
      } 
      return (String) methodNormalize.invoke(null, word, nfcNormalization); 
     } catch (Exception ex) { 
      return null; 
     } 
    } 

這個函數是如何工作的?它究竟在做什麼?

+3

這屬於TheDailyWTF。 – 2009-08-14 20:06:35

回答

5

它確實一樣:

import java.text.Normalizer; 

try { 
    return Normalizer.normalize(word, Normalizer.Form.NFC); 
} catch (Exception ex) { 
    return null; 
} 

除了所有的操作都通過反射執行。

+0

它應該這樣寫,除非你真的需要在Java6之前編譯(而不是僅僅運行)。如果您捕獲所有異常(也可能是某些類加載相關的錯誤),那麼此代碼甚至在Normalizer類不存在的JDK5上會優雅地退化。不過,您需要在Java6上進行編譯。 (使用反射版本,你也可以在較舊的Java上編譯,雖然可能會認爲你實際上並沒有編譯任何東西,但是所有反射都在那裏)。 – Thilo 2009-08-15 00:20:10

3

它使用反射來調用

java.text.Normalizer.normalize(word, java.text.Normalizer.Form.NFC); 

大概是爲了使其在1.6之前的Java版本不具備這個類運行。

+0

@Ben:你可能是對的:http://stackoverflow.com/questions/1277270 – 2009-08-14 20:14:45

2

此函數提供有關Unicode字符串規範化的服務。在Unicode中,您可以用多種方式表示相同的內容。例如,你有一個帶口音的角色。你可以使用一個單一的Unicode字符來表示它的加入,或者分解(原始的字母,沒有重音,然後修飾符 - 重音)。

這個類來自Java 6.對於Java 5,有一個SUN專有類。

一種方式來獲得Java 5中(SUN JDK)和Java 6中歸一化器都可以看到info.olteanu.utils.TextNormalizer類Phramer項目(http://sourceforge.net/projects/phramer/,www.phramer.org),沒有任何編譯問題(代碼將在任何編譯版本> = 5,代碼將在兩個JVM中運行,但SUN會丟棄Java 5專有類)。