Java反射和基元上的isInstance

| 我在这里一定会丢失一些东西,但是似乎在进行一些基本思考时遇到了一些麻烦。我认为,由于像拳击这样的事情,对于下面的两个印刷品中的每一个,我都会得到真实的。这是简单的Main类:
package com.reflection;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class TestingReflection {

    public static void main(String[] args) throws SecurityException,
                                                  NoSuchMethodException,
                                                  IllegalArgumentException, 
                                                  IllegalAccessException,
                                                  InvocationTargetException 
    {
        final Class c = Reflection.class;
        Reflection p = new Reflection();
        p.setIntObj(new Integer(1));
        p.setIntPrim(1);
        for (Field field : c.getDeclaredFields()) {
            char first = Character.toUpperCase(field.getName().charAt(0));
            String capitalized = first + field.getName().substring(1);
            Method getField = 
                  c.getDeclaredMethod(\"get\" + capitalized, new Class [] {});
            Class fieldClass = getField.getReturnType();
            Method setField = 
                  c.getDeclaredMethod(\"set\" + capitalized,
                                      new Class [] { fieldClass });
            Object value = getField.invoke(p, new Object [] {});
            if (value != null) {
                System.out.println(\"Field Class: \" 
                                    + fieldClass.getName() 
                                    + \" instanceOf: \" 
                                    + fieldClass.isInstance(value) 
                                    + \" Value Class: \" 
                                    + value.getClass().getName());
            }
        }
    }
}
这是我要针对的课程:
package com.reflection;

public class Reflection {

    private int intPrim;
    private Integer intObj;
    public int getIntPrim() { return intPrim; }
    public void setIntPrim(int intPrim) { this.intPrim = intPrim; }
    public Integer getIntObj() { return intObj; }
    public void setIntObj(Integer intObj) { this.intObj = intObj; }
}
这是我收到的输出:
Field Class: int instanceOf: false Value Class: java.lang.Integer
Field Class: java.lang.Integer instanceOf: true Value Class: java.lang.Integer
我应该使用其他方法来确定这一点吗? isAssignableFrom还为基元返回false。     
已邀请:
        获取
int
的原始类型的最简单方法是
int.class
您也可以使用
Integer.TYPE
,但是我相信这样做是为了向后兼容。 Java doc Class.isIntanceof(Object)说   如果此Class对象表示原始类型,则此方法返回false。 这也许不是有用的定义,但它是它的工作方式。我还没有找到获取原始类型的包装器类的简单方法,因此我使用了预定义的HashMap(它有9个类,包括
void
)。     
        看看Integer.TYPE     
        为了基于Peter的答案,Class.isInstance()无法报告基本类型的原因是因为必须对作为参数传递的任何基本进行装箱以便将其传递为
Object
。这本质上使得该方法对表示原始类型的“ 8”个对象无效。 当然,在您的情况下,int的值已经随您的调用一起装箱了:
Object value = getField.invoke(p, new Object [] {});
    

要回复问题请先登录注册