在Java中获取包装器类类型的简单方法

我有一段代码,我需要在方法中传递一个字段的类。 由于我的代码的机制,我只能处理引用对象而不是基元。 我想要一种简单的方法来确定Field的类型是否是原始的,并将其与适当的包装类交换。 所以在代码中我到目前为止所做的是这样的:

 Field f = getTheField(); // Dummy method that returns my Field Class c = f.getType(); if (c == int.class) { c = Integer.class; } else if (c == float.class) { c = Float.class; } // etc myMethod(c); 

这工作正常,除了我需要显式检查所有原始类型并使用适当的包装类交换它们。 现在我知道没有那么多原始类型,简单地列出它们就不会有问题,但我想知道是否有更简单,更优雅的方式。

我在回答中使用了Google Collections Library,因为我已经被宠坏了,但如果你愿意的话,你可以看看如何使用简单的HashMaps来实现它。

  // safe because both Long.class and long.class are of type Class @SuppressWarnings("unchecked") private static  Class wrap(Class c) { return c.isPrimitive() ? (Class) PRIMITIVES_TO_WRAPPERS.get(c) : c; } private static final Map, Class> PRIMITIVES_TO_WRAPPERS = new ImmutableMap.Builder, Class>() .put(boolean.class, Boolean.class) .put(byte.class, Byte.class) .put(char.class, Character.class) .put(double.class, Double.class) .put(float.class, Float.class) .put(int.class, Integer.class) .put(long.class, Long.class) .put(short.class, Short.class) .put(void.class, Void.class) .build(); 

奇怪的是JDK中没有任何东西存在,但实际上什么也没有。

编辑:我完全忘记了我们发布了这个:

http://google.github.io/guava/releases/21.0/api/docs/com/google/common/primitives/Primitives.html

它有wrap()方法,还有unwrap()和一些其他附带的东西。

Apache Commons Lang有一个实用程序方法来执行此操作( ClassUtils.primitiveToWrapper() ),这将在封面下同样丑陋,但至少你可以假装它很好。

您可以调用class.isPrimitive()来知道它是否是原语,但是,没有装箱方法来转换JDK中的类。 至少有一个与此相关的漏洞 。

如果您不需要高度优化的代码,这是另一种方法:

  Class primitive=long.class; Class boxed=Array.get(Array.newInstance(primitive,1),0).getClass(); System.out.println(primitive.getName()); System.out.println(boxed.getName()); 

(编辑/添加说明)

首先,看看Java是否有一个方法在给定基本类型时为您提供包装类。 找不到任何东西。

然后,看看你是否可以在给出一个原始类型时让Java创建一个原始值(然后你可以以某种方式从它中获取一个对象)。 找不到办法做到这一点。

但后来发现,当给定基本类型时,您可以让Java创建一个原始值数组。 然后有一个Java方法,它为您提供数组元素的包装类型的对象(它是原始的)。 获得该对象后,即可获得该类型。

所以这就是整个过程的工作方式:

方法Array.newInstance()创建一个您指定的任何类型的数组,无论它是基元还是对象。 在object的情况下,所有元素都是对象类型,但初始化为null。 在原始的情况下,元素是原始类型。 但原始变量/数组元素不能为空,因此它们具有基本类型的默认值,例如int将为零。 因此,没有元素将为null。 现在,如果你试图通过使用Array.get()来获取元素的值,那么Array.get()除了选择对象的原始值之外别无选择,例如int到Integer,因为Array.get()可以’ t返回原始值。 现在你有一个原始基本类型的装箱(包装)类型的对象。 最后调用Object.getClass()为您提供装箱(包装)类型。

这个技巧适用于今天和未来Java中的任何原始类型。

(想法)获取类名并制作首字母大写,然后调用Class.forInstance(className).newInstance(primitive)。 例外是“char” – > Character和“int” – > Integer

  Class c=Primitive class object if (c.isPrimitive()) { if (c == char.class) { Object wrapper=new Character(primitive var); } if (c == int.class) { Object wrapper=new Integer(primitive var); } else { String name=c.getName(); try { Class c2=Class.forName("java.lang."+name.substring(0,1).toUpperCase()+name.substring(1,name.length())); Object wrapper=c2.getConstructor(c).newInstance(primitve_var); } catch (ClassNotFoundException ex) { System.out.println("RROR"); } } } 

还有com.sun.beans.finder.PrimitiveWrapperMap #getType(primitiveName)。 但是当然不建议使用“com.sun”包中的类…

 Class toWrapper(Class clazz) { if (!clazz.isPrimitive()) return clazz; if (clazz == Integer.TYPE) return Integer.class; if (clazz == Long.TYPE) return Long.class; if (clazz == Boolean.TYPE) return Boolean.class; if (clazz == Byte.TYPE) return Byte.class; if (clazz == Character.TYPE) return Character.class; if (clazz == Float.TYPE) return Float.class; if (clazz == Double.TYPE) return Double.class; if (clazz == Short.TYPE) return Short.class; if (clazz == Void.TYPE) return Void.class; return clazz; }