Java Class.isAssignableFrom confusion

Kor*_*ben 9 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));
Run Code Online (Sandbox Code Playgroud)

这两个语句都返回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());
    }

}
Run Code Online (Sandbox Code Playgroud)

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

Mir*_*dak 9

我想,ClassUtils.isAssignable(Class, Class, boolean)从Apache commons-lang是帮助的人.

的JavaDoc


Ami*_*nde 5

int.class并且Integer.class是两个单独的类对象.查看this答案了解更多详情

来自Java doc Class#isAssignableFrom

确定此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是它们的超类或超接口.如果是这样,它返回true; 否则返回false.如果此Class对象表示基本类型,则如果指定的Class参数恰好是此Class对象,则此方法返回true;否则返回true.否则返回false.