Java Class.isAssignableFrom confusion

时间:2013-01-04 05:59:32

标签: java reflection

我发现原始类型问题

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());
    }

}

这似乎是我能做的最好的-_-!感谢

4 个答案:

答案 0 :(得分:9)

我想,来自Apache commons-lang的ClassUtils.isAssignable(Class, Class, boolean)是值得帮助的人。

JavaDoc

答案 1 :(得分:5)

int.classInteger.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);