簡體   English   中英

在ClassLoader中使用原始類型

[英]Using primitive types with ClassLoader

我有一段代碼,用於將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);
}

在我看來,這討厭,因此,有什么干凈的方法嗎?

由於您對此有一個例外: 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);
}

為了使生活更有趣,您還會遇到數組問題。 這可以解決數組問題:

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);中的包裝; -我在這里采購的。 我看不到一種更清潔的方法,但是我敢肯定必須有一種方法。

當然,原始類型的數組將需要進一步的特殊情況邏輯集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM