2012-07-01 18 views
5

Class.getCanonicalName()によって提供される文字列表現を対応するインスタンスClassに変換するためのコードがあります。これは通常ClassLoader.loadClass("className")を使って行うことができます。しかし、ClassNotFoundExceptionを投げるプリミティブ型では失敗します。私が出会った唯一の解決策は、このようなものだった:私に非常に厄介なようだClassLoaderでプリミティブ型を使用

private Class<?> stringToClass(String className) throws ClassNotFoundException { 
    if("int".equals(className)) { 
     return int.class; 
    } else if("short".equals(className)) { 
     return short.class; 
    } else if("long".equals(className)) { 
     return long.class; 
    } else if("float".equals(className)) { 
     return float.class; 
    } else if("double".equals(className)) { 
     return double.class; 
    } else if("boolean".equals(className)) { 
     return boolean.class; 
    } 
    return ClassLoader.getSystemClassLoader().loadClass(className); 
} 

ので、このための任意のクリーンなアプローチがありますか?

+1

は、Java 7にしている場合は、文字列に 'switch'を試してみてください。 –

+0

おっと、それは知ってうれしいです。しかし、要点は、String.equalsを使って特定の型をチェックしたくないということです。それは厄介な部分です。 – aRestless

答えて

3

この例外はあります:Class.forName(int.class.getName())ですから、これはやり方です。

Springフレームワークコードhttp://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/ClassUtils.htmlのクラス、メソッドresolvePrimitiveClassNameを確認すると、同じことをしているが地図が表示されます。ソースコード:このようなhttp://grepcode.com/file/repository.springsource.com/org.springframework/org.springframework.core/3.1.0/org/springframework/util/ClassUtils.java#ClassUtils.resolvePrimitiveClassName%28java.lang.String%29

何か:

private static final Map primitiveTypeNameMap = new HashMap(16); 
// and populate like this 
primitiveTypeNames.addAll(Arrays.asList(new Class[] { 
     boolean[].class, byte[].class, char[].class, double[].class, 
     float[].class, int[].class, long[].class, short[].class})); 
for (Iterator it = primitiveTypeNames.iterator(); it.hasNext();) { 
    Class primitiveClass = (Class) it.next(); 
    primitiveTypeNameMap.put(primitiveClass.getName(), primitiveClass); 
} 
+0

はい、 'Class.forName(" int ")'は、デフォルトのパッケージでクラス 'int'を検索します(javadocと言います)。 Javaデザインの赤字。 –

+0

Meh。原始的な「クラス」は必然的に汚れたハックになるでしょう。 –

+0

はい...残念ながら:/ –

0

ただ、生活をより楽しくするために、あなたは配列に問題もあるでしょう。これは、配列の問題を回避します:

private Pattern arrayPattern = Pattern.compile("([\\w\\.]*)\\[\\]"); 

public Class<?> getClassFor(String className) throws ClassNotFoundException { 
    Matcher m = arrayPattern.matcher(className); 
    if(m.find()) { 
     String elementName = m.group(1); 
     return Class.forName("[L" + elementName + ";"); // see below 
    } 
    return Class.forName(className); 
} 

[L(クラス名);のクラス名のラップ。 - 私はhereを出品しました。私はそれを行うよりクリーンな方法を見ることができませんが、私は1つでなければならないと確信しています。

プリミティブ型の配列は特殊なケースロジックのさらなるセットが必要になります。もちろん、...

関連する問題