2009-08-14 18 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に属します。 –

答えて

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

3

このクラスを持たない1.6以前のバージョンのJava上で実行できるようにするためにおそらく

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

を呼び出すためにリフレクションを使用しています。

+0

@Ben:あなたはおそらく正しいでしょう:http://stackoverflow.com/questions/1277270 –

2

この関数は、Unicodeの文字列正規化に関するサービスを提供します。 Unicodeでは、同じことをさまざまな方法で表現できます。たとえば、アクセントのある文字があります。 1つのUnicode文字を使用して結合したり、分解したもの(元の文字、アクセントなし、修飾子 - アクセント)を結合して表すことができます。

クラスにはJava 6が付属しています.Java 5の場合、SUN独自のクラスがあります。

は、コードがいずれかでコンパイルします(任意のコンパイルの問題もなく、Java 5の(SUN JDK)inおよびJava 6の正規化の両方を取得する方法をPhramerプロジェクト(http://sourceforge.net/projects/phramer/、www.phramer.org)でクラスinfo.olteanu.utils.TextNormalizerを参照してください。 version> = 5で、コードは両方のJVMで実行されますが、SUNはJava 5独自のクラスを破棄します)。

関連する問題