Java反射&原语上的isInstance

时间:2011-06-15 12:07:07

标签: java reflection primitive-types

我必须在这里遗漏一些东西,但我似乎在做一些基本的反思时遇到了麻烦。我认为,由于像拳击这样的东西,我会收到以下两个印刷品中的每一个。这是简单的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。

3 个答案:

答案 0 :(得分:5)

获取int原始类型的最简单方法是int.class您也可以使用Integer.TYPE,但我相信这是为了向后兼容。

Java doc Class.isIntanceof(Object)说

  

如果此Class对象表示基本类型,则此方法返回false。

这可能不是一个有用的定义,但它的工作方式。我还没有找到一种简单的方法来获取基本类型的包装类,所以我使用了预定义的HashMap(它有9个类,包括void

答案 1 :(得分:3)

查看Integer.TYPE

答案 2 :(得分:1)

基于Peter的答案,Class.isInstance()无法报告基本类型的原因是因为作为参数传入的任何原语必须被加框以便作为Object传递。这实质上使得该方法对于表示基本类型的Class对象无用。

当然,在您的情况下,int的值已经包含在您的电话中:

Object value = getField.invoke(p, new Object [] {});