2012-07-01 31 views
5

Tôi đã có một đoạn mã được sử dụng để biến các biểu diễn chuỗi được phân phối bởi Class.getCanonicalName() vào các phiên bản tương ứng của chúng là Class. Điều này thường có thể được thực hiện bằng cách sử dụng ClassLoader.loadClass("className"). Tuy nhiên, nó không thành công trên các kiểu nguyên thủy ném một số ClassNotFoundException. Giải pháp duy nhất tôi đi qua là một cái gì đó như thế này:Sử dụng các kiểu nguyên thủy với 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); 
} 

Điều đó có vẻ rất khó chịu với tôi, như vậy là có bất kỳ phương pháp sạch cho điều này?

+1

Nếu bạn đang sử dụng Java 7, bạn có thể thử 'chuyển' trên chuỗi. –

+0

Ouh, thật tuyệt khi biết. Tuy nhiên, vấn đề là tôi không muốn kiểm tra một số loại bằng cách sử dụng String.equals. Đó là phần khó chịu. – aRestless

Trả lời

3

Vì bạn có ngoại lệ cho điều này: Class.forName(int.class.getName()), tôi có thể nói đây là cách để thực hiện.

Kiểm tra mã khung Spring http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/util/ClassUtils.html lớp học, phương pháp resolvePrimitiveClassName, bạn sẽ thấy rằng chúng thực hiện tương tự, nhưng với bản đồ;). Source code: 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

Something như thế này:

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

Có, 'Class.forName (" int ")' sẽ tìm kiếm một lớp 'int' trong gói mặc định (nói javadoc). Thâm hụt trong thiết kế java. –

+0

Meh. Nguyên thủy "lớp" chắc chắn sẽ là một hack bẩn. –

+0

có ... không may: / –

0

Chỉ cần để làm cho cuộc sống vui hơn, bạn cũng sẽ gặp rắc rối với mảng. Điều này xảy ra xung quanh vấn đề mảng:

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

Bao bì tên lớp trong [L (tên lớp); - mà tôi có nguồn gốc here. Tôi không thể nhìn thấy một cách làm sạch hơn, nhưng tôi chắc chắn phải có một.

Tất nhiên, một loạt các kiểu nguyên thủy sẽ cần thêm một tập hợp các trường hợp đặc biệt ...

Các vấn đề liên quan