在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