2012-07-01 18 views
5

के साथ आदिम प्रकारों का उपयोग करना मेरे पास कोड का एक टुकड़ा है जिसका उपयोग द्वारा 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); 
} 

कि बहुत मेरे लिए बुरा लगता है, इसलिए इसके लिए किसी भी स्वच्छ दृष्टिकोण है?

+1

आप जावा 7 में हैं, तो आप स्ट्रिंग पर एक 'switch' कोशिश कर सकते हैं। –

+0

ओह, यह जानना अच्छा है। हालांकि, मुद्दा यह है कि मैं String.equals का उपयोग करके कुछ प्रकार की जांच नहीं करना चाहता हूं। यह बुरा हिस्सा है। – aRestless

उत्तर

3

चूंकि आपके पास इसके लिए अपवाद है: Class.forName(int.class.getName()), मैं कहूंगा कि यह जाने का तरीका है।

स्प्रिंग फ्रेमवर्क कोड 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

हां, 'कक्षा .forName ("int")' डिफ़ॉल्ट पैकेज में कक्षा 'int' की खोज करेगा (जावाडोक कहता है)। जावा डिजाइन में कमी। –

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

[एल (कक्षा नाम) में कक्षा के नाम की रैपिंग; - मैंने here सोर्स किया। मैं इसे करने का एक क्लीनर तरीका नहीं देख सकता, लेकिन मुझे यकीन है कि एक होना चाहिए।

बेशक आदिम प्रकार की एक सरणी विशेष मामले तर्क का एक और सेट की आवश्यकता होगी ...