我发现原始类型问题
System.out.println("Integer.class.isAssignableFrom(int.class) = " + Integer.class.isAssignableFrom(int.class));
System.out.println("int.class.isAssignableFrom(Integer.class) = "+int.class.isAssignableFrom(Integer.class));
这两个语句都向调用者返回false。所以这似乎拳击不适用于这里。我的问题是,如果我的观察结果是正确的,或者有其他API可以正确地进行此测试吗?
--------------------------------跟进------------- --------------------------------
正如我所说,我主要想在使用反射时检查对象是否可以赋值给Field。我希望机制在运行时可以更精确,所以我做了这样的实现。
public static boolean isAssignableFrom(final Field field, final Object obj) {
if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
return obj.getClass().equals(Integer.class) || field.getType().equals(int.class);
} else if (field.getType().equals(Float.class) || field.getType().equals(float.class)) {
return obj.getClass().equals(Float.class) || field.getType().equals(float.class);
} else if (field.getType().equals(Double.class) || field.getType().equals(double.class)) {
return obj.getClass().equals(Double.class) || field.getType().equals(double.class);
} else if (field.getType().equals(Character.class) || field.getType().equals(char.class)) {
return obj.getClass().equals(Character.class) || field.getType().equals(char.class);
} else if (field.getType().equals(Long.class) || field.getType().equals(long.class)) {
return obj.getClass().equals(Long.class) || field.getType().equals(long.class);
} else if (field.getType().equals(Short.class) || field.getType().equals(short.class)) {
return obj.getClass().equals(Short.class) || field.getType().equals(short.class);
} else if (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class)) {
return obj.getClass().equals(Boolean.class) || field.getType().equals(boolean.class);
} else if (field.getType().equals(Byte.class) || field.getType().equals(byte.class)) {
return obj.getClass().equals(Byte.class) || field.getType().equals(byte.class);
}
return field.getType().isAssignableFrom(obj.getClass());
}
}
这似乎是我能做的最好的-_-!感谢
答案 0 :(得分:9)
我想,来自Apache commons-lang的ClassUtils.isAssignable(Class, Class, boolean)
是值得帮助的人。
答案 1 :(得分:5)
int.class
和Integer.class
是两个独立的类对象。查看this
答案了解更多详情
来自Java doc Class#isAssignableFrom
确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口。如果是这样,它返回true;否则返回false。 如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回false。
答案 2 :(得分:3)
来自isAssignableFrom
上的the documentation:
此方法测试是否可以通过标识转换或扩展引用转换将指定的Class参数表示的类型转换为此Class对象表示的类型。有关详细信息,请参阅Java语言规范,第5.1.1和5.1.4节。
Integer
无法通过这种方式分配给int
(反之亦然),因此您的方法将返回false - 装箱和拆箱在编译时完成,而不是在运行时完成 - 请参阅{{ 3}}了解更多信息
答案 3 :(得分:0)
只是一个提示,您上面粘贴的代码中有一个错误。 如果使用“ field = int.class”调用该方法,则不管对象是什么类型,该方法将始终返回true。似乎是复制和粘贴错误;)
if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
return obj.getClass().equals(Integer.class) || field.getType().equals(int.class);
更好的是:
if (field.getType().equals(Integer.class) || field.getType().equals(int.class)) {
return obj.getClass().equals(Integer.class) || obj.getType().equals(int.class);