2012-07-01 51 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的時候,你可以嘗試在字符串'之開關。 –

+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

呃。原始「類」不可避免地會成爲一種骯髒的黑客攻擊。 –

+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(classname);中包裝類名稱。 - 我購買了here。我看不到一個更乾淨的方式,但我確定必須有一個。

當然原始類型的數組將需要另一套特殊情況的邏輯......