2009-08-14 32 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专有类)。