Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这个规范化函数是如何工作的?_Java - Fatal编程技术网

Java 这个规范化函数是如何工作的?

Java 这个规范化函数是如何工作的?,java,Java,我在做Junit教程时遇到了这个正在测试的规范化函数。它的定义如下: public static String normalizeWord(String word) { try { int i; Class<?> normalizerClass = Class.forName("java.text.Normalizer"); Class<?> normalizerFormClass

我在做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;
        }
    }
publicstaticstringnormalizeword(字符串字){
试一试{
int i;
类normalizerClass=Class.forName(“java.text.Normalizer”);
Class=null;
类[]nestedClasses=normalizerClass.getDeclaredClasses();
对于(i=0;i
这个函数是如何工作的?它实际上在做什么?

它的作用与:

import java.text.Normalizer;

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

除此之外,所有操作都是通过反射执行的。

它使用反射来调用

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

大概是为了允许它在1.6之前的Java版本上运行,这些版本没有此类。

此函数提供有关Unicode字符串规范化的服务。 在Unicode中,可以用多种方式表示同一事物。例如,您有一个带有重音的字符。您可以使用单个Unicode字符表示它的连接,也可以表示它的分解(原始字母,不带重音,然后是修饰符-重音)

这个类是用Java6实现的。对于Java5,有一个SUN专有类


请参阅Phramer项目中的类(,www.Phramer.org),以获得Java 5(SUN JDK)和Java 6中的规范化程序,而不存在任何编译问题(代码将在任何版本>=5中编译,代码将在两个JVM中运行,尽管SUN放弃了Java 5专有类)。如果您也捕获了所有异常(可能还有一些与类加载相关的错误),那么这段代码甚至会在JDK5上正常降级,因为在JDK5上不存在规范化器类。不过,您需要在Java6上编译。(使用反射版本,您也可以在较旧的Java上编译,尽管有人可能认为您实际上没有编译任何东西,因为所有反射都在那里)。