通过Reflection从Object的字段访问Array

时间:2014-10-21 17:43:40

标签: java reflection

Function接受Object并将所有非静态字段存储在Field类型的数组中。 '对于'记录每个非静态字段。如果非静态字段是原始类型,那么' if'部分没事。但如果该字段是一个数组,则else部分会产生问题。线条产生问题突出显示。这是访问阵列的正确方法吗?我程序的这部分代码如下。

public static void printDetails(Object o)
{
    // ...
    // field is a non-static field of the Class of Object 'o'

    String fieldName = field.getType().getName();
    if(fieldName.equals("int") || fieldName.equals("float") || fieldName.equals("java.lang.Boolean") || fieldName.equals("long") ||
               fieldName.equals("short") || fieldName.equals("char") || fieldName.equals("java.lang.String"))
    {
        Object sendObj = o, recvObj = null;
        recvObj = field.get(sendObj);
        System.out.println("\t  " + recvObj.toString());      // Ok for primitive data type case
    }
    else if(field.getType().isArray())
    {
        Object sendObj = o;
        Object recvArray = field.get(sendObj);                // returns 'null', array expected
        int length = Array.getLength(recvArray);
        for(int i=0; i<length; ++i)
        {
            Object element = Array.get(recvArray, i);
            System.out.println(element.toString());
        }
    }
}

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我的猜测是,您尝试在对象中访问的字段为空。下面是您自己的代码示例,该代码适用于非null的数组,并使用null数组重现您的结果。

哦,我修改了你的方法签名以获取Field参数。只是一个抬头,你要去测试它:

public static void printDetails(Object o, Field field) throws IllegalArgumentException, IllegalAccessException {

代码:

private static class Test {
    public int intField;
    public int[] nullIntArrayField;
    public int[] notNullIntArrayField = new int[]{1,2,3};
}

public static void main(String[] args){
    test();
}

private static void test() {
    try {
        Test test = new Test();
        Class testClass = test.getClass();
        Field intField = testClass.getField("intField");
        printDetails(test, intField);

        //works!!!
        intField = testClass.getField("notNullIntArrayField");
        printDetails(test, intField);

        //doesnt work!!!
        intField = testClass.getField("intArrayField");
        printDetails(test, intField);

    } catch (NoSuchFieldException ex) {
        Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
    } catch (SecurityException ex) {
        Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalArgumentException ex) {
        Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
        Logger.getLogger(Object.class.getName()).log(Level.SEVERE, null, ex);
    }
}

答案 1 :(得分:1)

即使我分析了同样的事情。 对象中数组的值为null

import java.lang.reflect.Array; import java.lang.reflect.Field;

class Shape {

int numberOfSides;

int[] arry = new int[100];

public int getNumberOfSides() {
    return numberOfSides;
}

public void setNumberOfSides(int numberOfSides) {
    this.numberOfSides = numberOfSides;
}

}

公共类App {

public static void main(String[] args) throws ClassNotFoundException,
        IllegalArgumentException, IllegalAccessException {

    printDetails(new Shape());

}

public static void printDetails(Object o) throws IllegalArgumentException,
        IllegalAccessException {
    Field[] fields = o.getClass().getDeclaredFields();
    Field field = fields[1];

    String fieldName = field.getType().getName();
    if (fieldName.equals("int") || fieldName.equals("float")
            || fieldName.equals("java.lang.Boolean")
            || fieldName.equals("long") || fieldName.equals("short")
            || fieldName.equals("char")
            || fieldName.equals("java.lang.String")) {
        Object sendObj = o, recvObj = null;
        recvObj = field.get(sendObj);
        System.out.println("\t  " + recvObj.toString()); // Ok for primitive
                                                            // data type
                                                            // case
    } else if (field.getType().isArray()) {
        Object sendObj = o;
        Object recvArray = field.get(sendObj); // returns 'null', array
                                                // expected
        int length = Array.getLength(recvArray);
        for (int i = 0; i < length; ++i) {
            Object element = Array.get(recvArray, i);
            System.out.println(element.toString());
        }
    }
}

}

按原样运行代码。 之后 修改类形状 到

class Shape {

int numberOfSides;

int[] arry;

public int getNumberOfSides() {
    return numberOfSides;
}

public void setNumberOfSides(int numberOfSides) {
    this.numberOfSides = numberOfSides;
}

}

您将获得例外。 希望这有帮助