gpt4 book ai didi

java - 通过反射从对象的字段访问数组

转载 作者:行者123 更新时间:2023-12-02 05:21:22 25 4
gpt4 key购买 nike

函数接受一个对象并将所有非静态字段存储在 Field 类型的数组中。 'for' 记录每个非静态字段。如果非静态字段是原始类型,那么“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());
}
}
}

任何帮助将不胜感激。

最佳答案

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

哦,我修改了你的方法签名以获取 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);
}
}

关于java - 通过反射从对象的字段访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26492946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com