在Java中如何輕鬆將原始類對象轉換爲對象類對象?給定一個類CL,我想把它轉換成一個沒有原語的類。例如。Java:轉換原始類
Class<?> cl = int.class;
...
if (cl.isPrimitive()) {
cl = Object of primitive
}
...
CL == Integer.class
我想這確實是一個方法,所有基本類型。很明顯,我可以遍歷所有基本類型,但我認爲有人可能知道更好的解決方案。
乾杯, 最大
在Java中如何輕鬆將原始類對象轉換爲對象類對象?給定一個類CL,我想把它轉換成一個沒有原語的類。例如。Java:轉換原始類
Class<?> cl = int.class;
...
if (cl.isPrimitive()) {
cl = Object of primitive
}
...
CL == Integer.class
我想這確實是一個方法,所有基本類型。很明顯,我可以遍歷所有基本類型,但我認爲有人可能知道更好的解決方案。
乾杯, 最大
希望我的理解是正確的。基本上你需要從原始類類型到它們的包裝器方法的映射。
在一些實用類實現的靜態實用方法,將是一個完美的解決方案,因爲你會使用這樣的轉換:
Class<?> wrapper = convertToWrapper(int.class);
另外,聲明並填充靜態地圖:
public final static Map<Class<?>, Class<?>> map = new HashMap<Class<?>, Class<?>>();
static {
map.put(boolean.class, Boolean.class);
map.put(byte.class, Byte.class);
map.put(short.class, Short.class);
map.put(char.class, Character.class);
map.put(int.class, Integer.class);
map.put(long.class, Long.class);
map.put(float.class, Float.class);
map.put(double.class, Double.class);
}
private Class<?> clazz = map.get(int.class); // usage
是的,這幾乎是我最終做到的。感謝那。 – Max 2010-08-13 06:24:13
你忘了void.class。只是在說' – 2015-10-14 18:45:38
org.apache.commons.lang.ClassUtils.primitiveToWrapper(Class)
或者,如果您使用的是Guava,它有Primitives class,whi CH您可以使用這樣的:
Primitives.wrap(int.class); //returns Class<Integer>
Primitives.wrap(Integer.class); //returns Class<Integer>
兩個番石榴和Apache共享使用底層HashMap<Class<?>, Class<?>>
這是不是真的有必要,但爲使代碼readible。
以下黚優化片段執行在恆定的時間相同的功能,因爲它映射到經由索引查找一個包裝類:
private static final Class[] wrappers = {
Integer.class,
Double.class,
Byte.class,
Boolean.class,
Character.class,
Void.class,
Short.class,
Float.class,
Long.class
};
@SuppressWarnings("unchecked")
public static <T> Class<T> wrap(final Class<T> clazz) {
if (!clazz.isPrimitive()) return clazz;
final String name = clazz.getName();
final int c0 = name.charAt(0);
final int c2 = name.charAt(2);
final int mapper = (c0 + c0 + c0 + 5) & (118 - c2);
return (Class<T>) wrappers[mapper];
}
有一點代碼高爾夫參與,所以不要重新排序類,除非你知道什麼喲你在做;)
你能解釋算法的工作原理嗎? – luckydonald 2016-02-04 01:41:18
它使用實際類名的兩個字母來執行非常有限的索引查找。相同的算法也可用於將包裝轉換爲基元,唯一的區別是您需要查找字母10和12(java.lang.prefix)。 下面是一些更多的代碼,與單元測試一起: https://github.com/melezov/runtime-bytegen/blob/master/src/main/java/org/revenj/Primitives.java – melezov 2016-02-05 02:16:16
只需創建一個地圖常量。我認爲八宗案件不值得打擾。 – 2010-08-13 03:57:44
是啊......你說得對。無論如何,已經這樣做了,只是以爲我可能會錯過一個方法,爲我做到這一點。 – Max 2010-08-13 05:39:42