这是我的实用方法:
public static Class<?>[] getTypes(Object[] objects){
Class<?>[] types = new Class<?>[objects.length];
for (int i = 0; i < objects.length; i++) {
types[i] = objects[i].getClass();
}
return types;
}
以下是失败的测试用例:
@Test
public void getTypesTest() {
Object[] objects = {"String", new StringBuilder(), new Integer(5), 5};
Class<?>[] classes = ReflectionUtils.getTypes(objects);
assertTrue(classes[0].equals(String.class));
assertTrue(classes[1].equals(StringBuilder.class));
assertTrue(classes[2].equals(Integer.class));
assertTrue(classes[3].equals(int.class)); // Fails here
}
当我在5
内传递Object[]
时,我意识到,这是封装为new Integer(5)
。
我怎样才能得到我期待的行为?
修改
我期待的是:在我的测试中失败的断言将通过。我应该怎样处理测试方法才能实现这个目标?:
答案 0 :(得分:3)
您不能将基元视为对象,因为这是将基元定义为与对象不同的基元。通过拥有一个对象数组,您可以确保其中的所有内容都是对象,而不是原始对象。
int
不是一个对象,因此您无法将其放在Object[]
中,因此编译器将生成代码以自动将您的值设置为5.即它调用Integer.valueOf(5)
这比new Integer(5)
更有效,但仍然是一个对象。
你不能在原语上调用.equals()
,所以这个编译的事实告诉你它不是。
顺便说一句,您可以使用int.class
获取int
的课程。
我怎样才能得到我期待的行为?
你能说出你对英语的期待吗?
对于那些感兴趣的人,Java 6和7中的Integer.valueOf(int)代码
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
答案 1 :(得分:0)
它失败的原因是你有一个对象数组。原始类型int
的值为Integer
,Integer
为assertTrue(classes[3].equals(int.class)); // Fails here
,因此数组在第3位包含assertTrue(classes[3].equals(Integer.class));
的实例。您可以通过替换
{{1}}
与
{{1}}