5

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

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);
}

それは私には非常に厄介に思えますが、これに対するクリーンなアプローチはありますか?

4

2 に答える 2

4

これには例外があるので: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);
}
于 2012-07-01T18:57:48.700 に答える
1

人生をもっと楽しくするために、配列にも問題があります。これにより、アレイの問題が回避されます。

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(classname);でのクラス名のラッピング。-私がここで調達したもの。きれいな方法はわかりませんが、きっとあるはずです。

もちろん、プリミティブ型の配列には、特別な場合のロジックのセットがさらに必要になります...

于 2012-07-01T19:50:21.987 に答える