2010-08-13 58 views
16

在Java中如何轻松将原始类对象转换为对象类对象?给定一个类CL,我想把它转换成一个没有原语的类。例如。Java:转换原始类

Class<?> cl = int.class; 

... 
if (cl.isPrimitive()) { 
    cl = Object of primitive 
} 
... 

CL == Integer.class

我想这确实是一个方法,所有基本类型。很明显,我可以遍历所有基本类型,但我认为有人可能知道更好的解决方案。

干杯, 最大

+1

只需创建一个地图常量。我认为八宗案件不值得打扰。 – 2010-08-13 03:57:44

+0

是啊......你说得对。无论如何,已经这样做了,只是以为我可能会错过一个方法,为我做到这一点。 – Max 2010-08-13 05:39:42

回答

22

希望我的理解是正确的。基本上你需要从原始类类型到它们的包装器方法的映射。

在一些实用类实现的静态实用方法,将是一个完美的解决方案,因为你会使用这样的转换:

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 
+0

是的,这几乎是我最终做到的。感谢那。 – Max 2010-08-13 06:24:13

+2

你忘了void.class。只是在说' – 2015-10-14 18:45:38

11

org.apache.commons.lang.ClassUtils.primitiveToWrapper(Class)

6

或者,如果您使用的是Guava,它有Primitives class,whi CH您可以使用这样的:

Primitives.wrap(int.class); //returns Class<Integer> 
Primitives.wrap(Integer.class); //returns Class<Integer> 
0

两个番石榴和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]; 
} 

有一点代码高尔夫参与,所以不要重新排序类,除非你知道什么哟你在做;)

+0

你能解释算法的工作原理吗? – luckydonald 2016-02-04 01:41:18

+0

它使用实际类名的两个字母来执行非常有限的索引查找。相同的算法也可用于将包装转换为基元,唯一的区别是您需要查找字母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